针对Ben Barnes的评论并从他的mydf3
开始:
DT = as.data.table(mydf3)
setkey(DT,Id,Time)
DT[CJ(unique(Id),seq(min(Time),max(Time)))]
Id Time Value Id2
[1,] 1 1 -0.262482283 2
[2,] 1 2 -1.423935165 2
[3,] 1 3 0.500523295 1
[4,] 1 4 -1.912687398 1
[5,] 1 5 -1.459766444 2
[6,] 1 6 -0.691736451 1
[7,] 1 7 NA NA
[8,] 1 8 0.001041489 2
[9,] 1 9 0.495820559 2
[10,] 1 10 -0.673167744 1
First 10 rows of 12800 printed.
setkey(DT,Id,Id2,Time)
DT[CJ(unique(Id),unique(Id2),seq(min(Time),max(Time)))]
Id Id2 Time Value
[1,] 1 1 1 NA
[2,] 1 1 2 NA
[3,] 1 1 3 0.5005233
[4,] 1 1 4 -1.9126874
[5,] 1 1 5 NA
[6,] 1 1 6 -0.6917365
[7,] 1 1 7 NA
[8,] 1 1 8 NA
[9,] 1 1 9 NA
[10,] 1 1 10 -0.6731677
First 10 rows of 25600 printed.
CJ
代表交叉连接,参见 ?CJ
。使用 NA
进行填充是因为默认情况下 nomatch
是 NA
。将 nomatch
设置为 0
可以去除未匹配项的填充。如果需要的是最接近的一行而不是填充 NA
,只需添加 roll=TRUE
。这比先用 NA
填充然后再填充 NA
要更有效率。请参见 ?data.table
中的 roll
描述。
setkey(DT,Id,Time)
DT[CJ(unique(Id),seq(min(Time),max(Time))),roll=TRUE]
Id Time Value Id2
[1,] 1 1 -0.262482283 2
[2,] 1 2 -1.423935165 2
[3,] 1 3 0.500523295 1
[4,] 1 4 -1.912687398 1
[5,] 1 5 -1.459766444 2
[6,] 1 6 -0.691736451 1
[7,] 1 7 -0.691736451 1
[8,] 1 8 0.001041489 2
[9,] 1 9 0.495820559 2
[10,] 1 10 -0.673167744 1
First 10 rows of 12800 printed.
setkey(DT,Id,Id2,Time)
DT[CJ(unique(Id),unique(Id2),seq(min(Time),max(Time))),roll=TRUE]
Id Id2 Time Value
[1,] 1 1 1 NA
[2,] 1 1 2 NA
[3,] 1 1 3 0.5005233
[4,] 1 1 4 -1.9126874
[5,] 1 1 5 -1.9126874
[6,] 1 1 6 -0.6917365
[7,] 1 1 7 -0.6917365
[8,] 1 1 8 -0.6917365
[9,] 1 1 9 -0.6917365
[10,] 1 1 10 -0.6731677
First 10 rows of 25600 printed.
不必设置键,可以使用on
。 CJ
还带有unique
参数。以下是一个包含两个'Id'的小例子:
d <- data.table(Id = rep(1:2, 4:3), Time = c(1, 2, 4, 5, 2, 3, 4), val = 1:7)
d[CJ(Id, Time = seq(min(Time), max(Time)), unique = TRUE), on = .(Id, Time)]
在这种特殊情况下,如果
CJ
中的一个向量是使用
seq
生成的,则需要明确命名结果以便与
on
中指定的名称匹配。但是,在
CJ
中使用裸变量时(例如此处的 'Id'),它们会自动命名,就像在
data.table(来自 data.table 1.12.2)
中一样。
expand.grid
,然后与all = TRUE
合并。不确定首先按ID拆分是否必要。 - jorandata_to_merge <- data.frame(id=unique(data$id),...)
(这是一行非常长的代码,如果数据结构发生更改,则不可移植)。但愿我能够高效地合并缺失的时间,添加NA,并从原始数据中获取所有其他内容。 - Maiasaura