【问题标题】:Insert missing time rows into a dataframe将缺失的时间行插入数据框中
【发布时间】:2015-09-17 22:39:11
【问题描述】:

假设我有一个数据框:

df <- data.frame(group = c('A','A','A','B','B','B'), 
                 time = c(1,2,4,1,2,3),
                 data = c(5,6,7,8,9,10))

我想要做的是将数据插入序列中缺少的数据框中。因此,在上面的示例中,我缺少 A 组的 time = 3 和 B 组的 time = 4 的数据。我基本上想用 0 代替 data 列。

我将如何添加这些额外的行?

目标是:

df <- data.frame(group = c('A','A','A','A','B','B','B','B'), 
                 time = c(1,2,3,4,1,2,3,4),
                 data = c(5,6,0,7,8,9,10,0))

我的真实数据是几千个数据点,所以手动这样做是不可能的。

【问题讨论】:

  • 时间序列填充缺失上有很多重复项。这只是一个更简单的情况,时间是整数而不是 POSIXct。

标签: r time-series missing-data


【解决方案1】:

你可以试试merge/expand.grid

 res <- merge(
          expand.grid(group=unique(df$group), time=unique(df$time)),
                                     df, all=TRUE)
 res$data[is.na(res$data)] <- 0
 res
 #  group time data
 #1     A    1    5
 #2     A    2    6
 #3     A    3    0
 #4     A    4    7
 #5     B    1    8
 #6     B    2    9
 #7     B    3   10
 #8     B    4    0

或使用data.table

 library(data.table)
 setkey(setDT(df), group, time)[CJ(group=unique(group), time=unique(time))
                     ][is.na(data), data:=0L]
 #    group time data
 #1:     A    1    5
 #2:     A    2    6
 #3:     A    3    0
 #4:     A    4    7
 #5:     B    1    8
 #6:     B    2    9
 #7:     B    3   10
 #8:     B    4    0

更新

正如 cmets 中提到的@thelatemail,如果所有组中都不存在特定的“时间”值,上述方法将失败。可能这会更笼统。

 res <- merge(
          expand.grid(group=unique(df$group), 
                      time=min(df$time):max(df$time)),
                                     df, all=TRUE)
 res$data[is.na(res$data)] <- 0

同样在 data.table 解决方案中将 time=unique(time) 替换为 time= min(time):max(time)

【讨论】:

  • 不错的答案,尽管它假定序列中的所有可能值都已在至少一个组中表示。例如。如果time = c(1,2,4,1,2,4) 这会失败。 OP 应该意识到这一点。
  • @thelatemail 最初,我想到了expand.grid(group=unique(df$group), min(df$time):max(df$time)) 我想这会起作用
  • 谢谢大家!该更新适用于我更大的数据框。
  • @puginablanket 很高兴知道它有效。感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 2015-07-01
  • 2020-04-12
  • 1970-01-01
  • 2019-06-24
  • 2020-10-22
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多