【问题标题】:How to subset in dplyr with the same conditions among multiple variables如何在多个变量中以相同条件在 dplyr 中进行子集化
【发布时间】:2016-09-30 04:47:46
【问题描述】:

我有一个按顺序排列的变量列表,我想知道在 dplyr 中是否有一种简单的方法在变量序列中具有相同条件的子集。

例如,我有以下变量:

DX1 DX2 DX3 DX4 DX5

如果这些变量中的任何一个包含以下字符串“7586”,我想要我的数据子集。

从单个变量中设置子集我会执行以下操作:

filter(df, DX1 == '7586')

我能想到的唯一方法是:

filter(df, DX1 == '7586' | DX2 == '7586' | DX3 == '7586' | DX4 == '7586' | DX5 == '7586')

我的实际数据集包含 DX1-DX25,编写起来会很乏味。

上面有没有简化的方法?

类似

的东西
filter(df, DX1-25 == '7586')

谢谢

【问题讨论】:

    标签: r filter dplyr subset


    【解决方案1】:

    如果 DX1 ~ DX25 是您的 data.frame 的所有或大部分列,可能是这样的?

    df[apply(df, 1, function(row) any(row == '7586')), ]
    
         x    y
    1 7586  322
    2 3322 7586
    

    数据

    structure(list(x = structure(c(2L, 1L), .Label = c("3322", "7586"
    ), class = "factor"), y = structure(1:2, .Label = c("322", "7586"
    ), class = "factor")), .Names = c("x", "y"), row.names = c(NA, 
    -2L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:
      select(data, DX1:DX25) %>% apply(., 1, function(x) any(x == '7586')) %>% data[. , ]
      

      【讨论】:

        【解决方案3】:

        两个选项,一个在 base R 中,一个在 dplyr 中,应该产生相同的结果:

        df[rowSums(df == 7586) > 0,]
        

        library(dplyr)
        df %>% 
           filter(rowSums(. == 7586) > 0)
        

        还有一个有趣的data.table 版本,如果需要的话,它应该会加快一点速度:

        library(data.table)
        setDT(df)[, .SD[Reduce(`+`, lapply(.SD, `==`, 7586) ) > 0] ]
        

        【讨论】:

        • 非常感谢您提供的所有选项!
        猜你喜欢
        • 2016-04-23
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多