【问题标题】:Conditional data manipulation using data.table in R在 R 中使用 data.table 进行条件数据操作
【发布时间】:2017-02-15 07:23:53
【问题描述】:

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

现在,如果 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

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    当您在testy[] 内并使用group by 时,您不需要引用testy,直接使用group 作为变量会给出正确的结果,您需要额外的else 语句来返回分组所在的行不在testx 内,如果您想将所有记录保存在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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2010-12-30
      相关资源
      最近更新 更多