将缺少的时间行插入数据帧

pug*_*ket 10 r time-series missing-data

假设我有一个数据帧:

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))
Run Code Online (Sandbox Code Playgroud)

我想要做的是将数据插入到序列中缺少的数据框中.所以在上面的例子中,我缺少time组A的= 3的数据,time组B的= 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))
Run Code Online (Sandbox Code Playgroud)

我的真实数据是几千个数据点,因此无法手动执行此操作.

akr*_*run 6

你可以试试 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
Run Code Online (Sandbox Code Playgroud)

或使用 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
Run Code Online (Sandbox Code Playgroud)

更新

正如@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
Run Code Online (Sandbox Code Playgroud)

并且类似地更换time=unique(time)time= min(time):max(time)在data.table溶液.