根据列中的值选择列

use*_*222 2 r tidyverse tibble

我正在使用tidyverse并且我知道该filter方法允许过滤具有与特定条件匹配的值的所有行,如下所示。它会筛选至少在某一列中值介于 0 到 3 之间的所有行。

filter_all(any_vars(. > 0 & .<3)) 
Run Code Online (Sandbox Code Playgroud)

我怎样才能在列的基础上做同样的事情?如果我的tibble看起来像下面这样,我想编写select一个返回至少一行中值大于 4 的所有列(应返回 B、C 列)

    | A | B | C |
    -------------
    | 1 | 1 | 2 |
    | 2 | 5 | 1 |
    | 3 | 6 | 9 |
Run Code Online (Sandbox Code Playgroud)

akr*_*run 11

我们可以select使用any

library(dplyr)
df1 %>%
      select_if(~ any(. > 4))
Run Code Online (Sandbox Code Playgroud)

-输出

#  B C
#1 1 2
#2 5 1
#3 6 9
Run Code Online (Sandbox Code Playgroud)

where或者像新版本一样使用

df1 %>%
    select(where(~ any(. > 4)))
#  B C
#1 1 2
#2 5 1
#3 6 9
Run Code Online (Sandbox Code Playgroud)

在 中base R,这可以通过以下方式完成Filter

Filter(function(x) any(x > 4), df1)
Run Code Online (Sandbox Code Playgroud)

或者与sapply

df1[sapply(df1, function(x) any(x > 4))]
Run Code Online (Sandbox Code Playgroud)

或与colSums

df1[colSums(df1 >4) > 0]     
Run Code Online (Sandbox Code Playgroud)

数据

df1 <- data.frame(A = 1:3, B = c(1, 5, 6), C = c(2, 1, 9))
Run Code Online (Sandbox Code Playgroud)