【问题标题】:Subsetting rows in R data.table based on conditional values for multiple variables基于多个变量的条件值对 R data.table 中的行进行子集化
【发布时间】:2018-06-13 22:44:18
【问题描述】:

我有兴趣仅对两个特定变量具有相同值和另一个变量具有两个不同值的行子集进行计算。

对于这个玩具数据集:

library(data.table)
DT = data.table(x = c(1,1,1,1,2,2,2,2,3,3,3,4,4,4,4,5,5,5,5,5), 
            y = c(10,10,10,10,24,24,26,26,51,51,51,34,34,34,34,65,65,65,65,65),
            z = c('m', 'm', 'f', 'f', 'b', 'b', 'm', 'm', 'b', 'b', 'b', 
            'm', 'm', 'f', 'f', 'b', 'b', 'b', 'b', 'b'))

我只对给定 x 值和 y 值的行感兴趣,其中 z 等于“m”和“f”。所以在这个表中,我需要一个脚本来提取 x=1 和 x=4 的行,因为这些是唯一 y 保持不变且 z 同时具有 'f' 和 'm' 值的行。如果 z 有一个“b”值,或者只有“f”或“m”,我不需要它。

【问题讨论】:

    标签: r data.table subset


    【解决方案1】:

    这实质上是检查是否所有z 都是m/f 并且所有m/f 都在z 中表示。所以:

    DT[, if(all(z %in% c("m","f")) & all(c("m","f") %in% z)) .SD,  by=.(x,y)]
    

    正如@Frank 在 cmets 中明智地建议的那样,这是setequal,所以:

    DT[, if(setequal(z, c("m","f"))) .SD,  by=.(x,y)]
    
    #   x  y z
    #1: 1 10 m
    #2: 1 10 m
    #3: 1 10 f
    #4: 1 10 f
    #5: 4 34 m
    #6: 4 34 m
    #7: 4 34 f
    #8: 4 34 f
    

    【讨论】:

      【解决方案2】:

      因为您正在查看 y 是否没有改变并且 z 包含 mf 我们将使用 all(c("m","f")%in%z) 来查看 z 是否同时包含 m 和 f 并使用 table(y)==.N 或 @987654326 @ 表示y 没有改变。然后将其合并回数据然后子集

      DT[DT,s := table(y)==.N & all(z %in% c("m","f")),on = "x",by = .EACHI][s==T][,s := NULL][]
         x  y z
      1: 1 10 m
      2: 1 10 m
      3: 1 10 f
      4: 1 10 f
      5: 4 34 m
      6: 4 34 m
      7: 4 34 f
      8: 4 34 f
      

      对于 tidyverse 格式:

      DT%>%
         group_by(x)%>%
          filter(length(unique(y)) == 1 & all(z %in% c("m","f")))
      # A tibble: 8 x 3
      # Groups:   x [2]
            x     y z    
        <dbl> <dbl> <chr>
      1    1.   10. m    
      2    1.   10. m    
      3    1.   10. f    
      4    1.   10. f    
      5    4.   34. m    
      6    4.   34. m    
      7    4.   34. f    
      8    4.   34. f
      

      【讨论】:

      • @DavidArenburg 非常感谢。刚刚做到了
      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 2014-09-30
      • 2019-09-07
      • 1970-01-01
      • 2020-04-27
      相关资源
      最近更新 更多