我有2个数据帧,testx和testy
testx
testx <- structure(list(group = 1:2), .Names = "group", class = "data.frame", row.names = c(NA,
-2L))
暴躁
testy <- structure(list(group = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L),
time = c(1L, 3L, 4L, 1L, 4L, 5L, 1L, 5L, 7L), value = c(50L,
52L, 10L, 4L, 84L, 2L, 25L, 67L, 37L)), .Names = c("group",
"time", "value"), class = "data.frame", row.names = c(NA, -9L
))
基于this topic,我使用以下代码添加缺少的时间值,这非常有效。
data <- setDT(testy, key='time')[, .SD[J(min(time):max(time))], by = group]
现在我想只添加这些缺失的时间值,如果组的值出现在testx中。在此示例中,因此我只想为匹配文件testx中的组值的组添加缺少的时间值。
data <- setDT(testy, key='time')[,if(testy[group %in% testx[, group]]) .SD[J(min(time):max(time))], by = group]
我得到的错误是“选择了未定义的列”。我查看了here,here和here,但我不明白为什么我的代码无效。我在大型数据集上这样做,为什么我更喜欢使用data.table
。
答案 0 :(得分:1)
当您在testy
并且正在使用testy[]
时,您不需要引用group by
,直接使用group
作为变量给出正确的结果,如果要保留testx
中的所有记录,需要额外的else语句来返回组不在testy
范围内的行:
testy[, {if(group %in% testx$group) .SD[J(min(time):max(time))] else .SD}, by = group]
# group time value
# 1: 1 1 50
# 2: 1 2 NA
# 3: 1 3 52
# 4: 1 4 10
# 5: 2 1 4
# 6: 2 2 NA
# 7: 2 3 NA
# 8: 2 4 84
# 9: 2 5 2
# 10: 3 1 25
# 11: 3 5 67
# 12: 3 7 37