首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为R中小于某一时间的时间间隔添加NA值

为R中小于某一时间的时间间隔添加NA值
EN

Stack Overflow用户
提问于 2021-09-22 13:24:23
回答 1查看 73关注 0票数 0

我有一个数据帧(df;见下文),其中包含时间序列上的位置(多年,位置是每小时给定的)。数据中有很多空位,虽然我计划运行一个模型来估计一些缺失的位置,但我需要删除超过10小时的空位,因为我无法估计这段时间(即保持10小时或更短的空位)。

数据集没有这些日期时间间隔的NA值。因此,我必须首先为指定日期范围内缺失的每个日期时间创建NA行(数据是从每年的9月1日到12月1日),然后删除NA间隔大于10小时的行。

我将不得不使用不同的时间阈值和多个数据集来运行此分析。因此,是否可以仅为特定的时间间隔大小添加nA值(为10小时或更短的时间间隔添加NAs ),而不是通过两个步骤完成此过程?这将消除消除超过10小时的时间间隔的需要。

以下是一些示例数据:

代码语言:javascript
运行
复制
table <- "id    date     time      lat       lon
1  A 2011-10-03 05:00:00 35.02957 -53.36053
2  A 2011-10-03 06:00:00 35.11430 -53.39990
3  A 2011-10-03 09:00:00 35.14563 -53.40357
4  A 2011-10-03 10:00:00 36.22431 -53.57891
5  A 2011-10-03 23:00:00 36.60950 -53.56792
6  B 2012-11-08 05:00:00 35.84570 -53.36992
7  B 2012-11-08 07:00:00 35.99980 -53.36084
8  B 2012-11-08 10:00:00 36.45001 -53.37093
9  B 2012-11-08 23:00:00 36.56789 -53.38654
10 B 2012-11-09 05:00:00 36.62456 -53.50901"

#Create a dataframe with above table
df <- read.table(text=table, header = TRUE)
df

下面是预期输出:

代码语言:javascript
运行
复制
table2 <- "id    date     time      lat       lon
1  A 2011-10-03 05:00:00 35.02957 -53.36053
2  A 2011-10-03 06:00:00 35.11430 -53.39990
3  A 2011-10-03 07:00:00 NA       NA
4  A 2011-10-03 08:00:00 NA       NA
5  A 2011-10-03 09:00:00 35.14563 -53.40357
6  A 2011-10-03 10:00:00 36.22431 -53.57891
7  A 2011-10-03 23:00:00 36.60950 -53.56792
8  B 2012-11-08 05:00:00 35.84570 -53.36992
9  B 2011-11-08 06:00:00 NA       NA
10 B 2012-11-08 07:00:00 35.99980 -53.36084
11 B 2011-11-08 08:00:00 NA       NA
12 B 2011-11-08 09:00:00 NA       NA
13 B 2012-11-08 10:00:00 36.45001 -53.37093
14 B 2012-11-08 23:00:00 36.56789 -53.38654
15 B 2011-11-09 00:00:00 NA       NA
16 B 2011-11-09 01:00:00 NA       NA
17 B 2011-11-09 02:00:00 NA       NA
18 B 2011-11-09 03:00:00 NA       NA
19 B 2011-11-09 04:00:00 NA       NA
20 B 2012-11-09 05:00:00 36.62456 -53.50901"

#Create a dataframe with the above table
expected <- read.table(text=table2, header = TRUE)
expected

编辑:

我应该补充说,这段代码还需要考虑到存在不同的ID,并且应该分别考虑每个ID的时间间隔,而不是所有ID之间的时间间隔(例如,不应该在第5行和第6行之间添加时间间隔,因为这是两个不同ID之间的时间间隔)。

编辑2:

Ronak Shah的答案是有效的。然而,有时我也必须使用分钟来运行这段代码。例如,时间间隔是每30分钟,我希望保持1小时/60分钟的间隔(两个30分钟的间隔),但不希望间隔超过这个间隔。有没有可能将Ronak Shah的回答改编成这样?

我尝试将单位更改为“分钟”,将>10改为">60“,并在第二行中保留”小时“,但这只是给我在间隔中的每一小时提供了安娜行,而我真的希望在每30分钟间隔中使用安娜,除非在该小时中有两个以上的30分钟间隔。我也尝试过其他迭代,当我真的想要每30分钟才迭代一次,并且间隔不超过一小时时,我会得到很多NAs。

代码语言:javascript
运行
复制
df %>%
  unite(datetime, date, time, sep = ' ') %>%
  mutate(datetime = lubridate::ymd_hms(datetime)) %>%
  group_by(id) %>%
  group_by(grp = cumsum(difftime(datetime, lag(datetime, default = first(datetime)), units = 'mins') > 60), .add = TRUE) %>%
  complete(datetime = seq(min(datetime), max(datetime), by = 'hour')) %>%
  ungroup %>%
  select(-grp)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-22 13:36:16

这里有一种使用dplyrtidyr的方法。

组合datetime列为每个id创建datetime创建一个grp列,该列为10小时内的时间值创建一个新组。使用complete在每个组中的最短时间和最长时间之间创建缺少的每小时序列。

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)

df %>%
  unite(datetime, date, time, sep = ' ') %>%
  mutate(datetime = lubridate::ymd_hms(datetime)) %>%
  group_by(id) %>%
  group_by(grp = cumsum(difftime(datetime, lag(datetime, default = first(datetime)), units = 'hours') > 10), .add = TRUE) %>%
  complete(datetime = seq(min(datetime), max(datetime), by = 'hour')) %>%
  ungroup %>%
  select(-grp)

#   id    datetime              lat   lon
#   <chr> <dttm>              <dbl> <dbl>
# 1 A     2011-10-03 05:00:00  35.0 -53.4
# 2 A     2011-10-03 06:00:00  35.1 -53.4
# 3 A     2011-10-03 07:00:00  NA    NA  
# 4 A     2011-10-03 08:00:00  NA    NA  
# 5 A     2011-10-03 09:00:00  35.1 -53.4
# 6 A     2011-10-03 10:00:00  36.2 -53.6
# 7 A     2011-10-03 23:00:00  36.6 -53.6
# 8 B     2012-11-08 05:00:00  35.8 -53.4
# 9 B     2012-11-08 06:00:00  NA    NA  
#10 B     2012-11-08 07:00:00  36.0 -53.4
#11 B     2012-11-08 08:00:00  NA    NA  
#12 B     2012-11-08 09:00:00  NA    NA  
#13 B     2012-11-08 10:00:00  36.5 -53.4
#14 B     2012-11-08 23:00:00  36.6 -53.4
#15 B     2012-11-09 00:00:00  NA    NA  
#16 B     2012-11-09 01:00:00  NA    NA  
#17 B     2012-11-09 02:00:00  NA    NA  
#18 B     2012-11-09 03:00:00  NA    NA  
#19 B     2012-11-09 04:00:00  NA    NA  
#20 B     2012-11-09 05:00:00  36.6 -53.5
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69285145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档