【问题标题】:Subset data.table by one variable based on conditional values in other variables根据其他变量中的条件值,通过一个变量对 data.table 进行子集
【发布时间】:2019-09-03 21:38:27
【问题描述】:

我在 R 中有一个 data.table,我需要根据某些条件对其进行子集化

dt <- data.table(X_ID=c(1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4), Y_ID=c(1,2,3,4,5,6, 1,2,3,4,5,6, 1,2,3,4,5,6, 1,2,3,4,5,6), Value1=c(6,4,8,9,10,12,5,7,8,3,4,8,7,3,9,7,4,12,45,3,2,1,2,5),Value2=c(6,6,8,9,10,12,5,4,8,3,4,8,7,5,9,7,4,12,45,1,2,1,2,5))

当 Y_ID 等于 2 时,我想保留值 1 大于值 2 的所有 X_ID。例如,对于 X_ID=1,当 Y_ID=2 时,值 1 大于值 2。在这种情况下,我想保留所有 X_ID=1 的行。

我目前正在使用过滤器功能(如下所示)来获得解决方案。

dt2 <- filter(dt,is.na(match(dt$X_ID,filter(dt, Y_ID==2&Value1<Value2)$X_ID)))

但是有没有办法让这段代码更具可读性?或者使用 data.table 原生的东西来对我需要的行进行子集化?

【问题讨论】:

    标签: r data.table subset


    【解决方案1】:

    使用data.table

        dt<-dt[X_ID %in% dt[(Y_ID == 2 & (Value1 > Value2))]$X_ID]
    
    #    X_ID Y_ID Value1 Value2
    #1:    2    1      5      5
    #2:    2    2      7      4
    #3:    2    3      8      8
    #4:    2    4      3      3
    #5:    2    5      4      4
    #6:    2    6      8      8
    #7:    4    1     45     45
    #8:    4    2      3      1
    #9:    4    3      2      2
    #10:    4    4      1      1
    #11:    4    5      2      2
    #12:    4    6      5      5
    

    【讨论】:

    • 刚刚注意到上面提到的子集代码并没有改变仍然包含 24 行的原始 data.table (与其他 data.table 操作不同,例如在原始 data.table 中添加新的计算列也会通过添加的新列进行内联更新)。我需要将此输出分配给一个新的 data.table 以存储被选中的行。出于好奇,知道为什么 data.table 中不同类型的操作之间存在这种差异吗?
    【解决方案2】:

    对于Y_ID == 2Value1 &gt; Value2 至少有一个值的组,我们可以使用dplyr group_by X_IDfilter

    library(dplyr)
    
    dt %>%
      group_by(X_ID) %>%
      filter(any(Y_ID == 2 & Value1 > Value2))
    
    #    X_ID  Y_ID Value1 Value2
    #   <dbl> <dbl>  <dbl>  <dbl>
    # 1     2     1      5      5
    # 2     2     2      7      4
    # 3     2     3      8      8
    # 4     2     4      3      3
    # 5     2     5      4      4
    # 6     2     6      8      8
    # 7     4     1     45     45
    # 8     4     2      3      1
    # 9     4     3      2      2
    #10     4     4      1      1
    #11     4     5      2      2
    #12     4     6      5      5
    

    【讨论】:

      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 2016-05-29
      • 2019-09-04
      • 2020-10-06
      • 2022-07-15
      • 1970-01-01
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多