使用R中的data.table进行条件数据操作

时间:2016-10-06 13:51:22

标签: r data.table

我有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]

我得到的错误是“选择了未定义的列”。我查看了hereherehere,但我不明白为什么我的代码无效。我在大型数据集上这样做,为什么我更喜欢使用data.table

1 个答案:

答案 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