【问题标题】:filter rows when all columns greater than a value当所有列都大于一个值时过滤行
【发布时间】:2018-11-20 05:35:43
【问题描述】:

我有一个数据框,我想对所有列值都满足我的截止值的行进行子集化。

这是数据框:

   A B C
1  1 3 5
2  4 3 5
3  2 1 2

我想选择的是所有列都大于 2 的行。 第二行是我想要的。

[1] 4 3 5

这是我的代码:

 subset_data <- df[which(df[,c(1:ncol(df))] > 2),]

但我的代码并未应用于所有列。 你知道我该如何解决这个问题。

【问题讨论】:

    标签: r dataframe select dplyr subset


    【解决方案1】:

    我们可以创建一个逻辑矩阵,将整个数据框与 2 进行比较,然后对其执行 rowSums 并仅选择值等于 df 中的列数的那些行

    df[rowSums(df > 2) == ncol(df), ]
    
    #  A B C
    #2 4 3 5
    

    使用filter_allall_varsdplyr 方法

    library(dplyr) 
    df %>% filter_all(all_vars(. > 2))
    
    #  A B C
    #1 4 3 5
    

    dplyr > 1.0.0

    #1. if_all
    df %>% filter(if_all(.fns = ~. > 2))
    
    #2. across
    df %>% filter(across(.fns = ~. > 2))
    

    apply 方法

    #Using apply
    df[apply(df > 2, 1, all), ]
    #Using lapply as shared by @thelatemail
    df[Reduce(`&`, lapply(df, `>`, 2)),]
    

    【讨论】:

    • 有趣的功能方法 - dat[Reduce(`&amp;`, lapply(dat, `&gt;`, 2)),]
    • 哦,看起来 apply 被所有数据科学家普遍不喜欢(熊猫也是)
    • @coldspeed 在 R 中,apply 在大多数情况下实际上非常慢,尤其是在处理数据帧时,它将数据帧转换为矩阵。
    • 仅供参考,df[rowSums(df &gt; 2) == ncol(df), ] 只给出了 R 3.6.1 中的值。使用dplyr 版本提供了所需的data.frame 输出。
    • @amc 这可能是因为您在数据框中只有 1 列。使用df[rowSums(df &gt; 2) == ncol(df), , drop = FALSE]
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多