【问题标题】:Filter data frame using the last_col() function in dplyr R使用 dplyr R 中的 last_col() 函数过滤数据帧
【发布时间】:2021-02-01 17:49:13
【问题描述】:

我有多个看起来像这样的数据框

time <- c(1,1,1,1,2,2,2,2,3,3,3,3)
ID <- c(1,2,3,4,1,2,3,4,1,2,3,4)
value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5,0.20,0.40,0.50,0.60)

test <- data.frame(time, ID, value)
test

  time ID value
1     1  1  0.00
2     1  2  0.10
3     1  3  0.20
4     1  4  0.40
5     2  1  0.00
6     2  2  0.05
7     2  3  0.05
8     2  4  0.50
9     3  1  0.20
10    3  2  0.40
11    3  3  0.50
12    3  4  0.6

我希望能够根据最后一列中小于 0.05 的值过滤数据框。 我知道我可以在 baseR 中轻松使用 test[,ncol(test)] &lt;0.05 有没有办法可以将它合并到 dplyr 管道中或使用 last_col() 函数 类似:test %&gt;% filter(.,last_col()&lt;0.05)

感谢任何帮助

【问题讨论】:

    标签: r dplyr tidyverse tidyr


    【解决方案1】:

    dplyr >= 1.0.0

    使用dplyr::across

    df %>% 
      dplyr::filter(across(last_col(), ~ . < 0.05))
    

    across 在这里工作,因为last_col 返回一个列。如果您正在处理多个列,我建议使用if_anyif_all(取决于您的逻辑)。有关更多信息,请参阅SO answer


    dplyr

    使用filter_at

    df %>%
      dplyr::filter_at(vars(last_col()), ~ . < 0.05)
    

    varslast_col 也来自 dplyr 包。

    【讨论】:

    • 我认为 filter_at 函数已被弃用。最好习惯across
    【解决方案2】:

    我用下面的代码用dplyr和filter过滤

    library(dplyr)
    
    time <- c(1,1,1,1,2,2,2,2,3,3,3,3)
    ID <- c(1,2,3,4,1,2,3,4,1,2,3,4)
    value <- c(0,0.1,0.2,0.4,0,0.05,0.05,0.5,0.20,0.40,0.50,0.60)
    
    test <- data.frame(time, ID, value)
    
    test.filter <- test %>%
                      filter(value <= 0.05)
    

    【讨论】:

      【解决方案3】:

      此语法计算出最后一列的变量名,并使用基本过滤器

      test %>% filter(!!sym((variable.names(test))[ncol(test)]) < 0.05)
      

      【讨论】:

        猜你喜欢
        • 2019-08-08
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        • 2021-02-27
        相关资源
        最近更新 更多