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)
我的真实数据是几千个数据点,因此无法手动执行此操作.
你可以试试 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溶液.