在 R 中,如何删除所有值为 FALSE 的列?

In R, how do I drop a column whose values are all FALSE?

我有一个数据框,df。它的一些专栏包括逻辑。我想放弃所有 FALSE.

library(tibble)
df <- tibble(A = rep(TRUE, 5),
             B = rep(FALSE, 5),
             C = c(TRUE, FALSE, TRUE, TRUE, FALSE))

df

# A tibble: 5 x 3
  A     B     C    
  <lgl> <lgl> <lgl>
1 TRUE  FALSE TRUE 
2 TRUE  FALSE FALSE
3 TRUE  FALSE TRUE 
4 TRUE  FALSE TRUE 
5 TRUE  FALSE FALSE

期望的输出是:

  A     C    
  <lgl> <lgl>
1 TRUE  TRUE 
2 TRUE  FALSE
3 TRUE  TRUE 
4 TRUE  TRUE 
5 TRUE  FALSE

我曾尝试使用 janitor 包选择常量列,但这也会删除全部 TRUE 的列。

我该怎么做? (我更喜欢 tidyverse 解决方案,但除非使用 base R 或其他一些可用的包,否则是可以接受的。)

编辑:我上面的最小工作示例太小了。我应该提到我也想保留一些非逻辑列。 akrun 在聊天中为我提供的解决方案是:

library(dplyr)
library(purrr)
df %>% select(where(~ is.logical(.) && any(.)), where(negate(is.logical)))

base RFilterany

结合使用
Filter(any, df)

或在dplyr

library(dplyr)
df %>%
    select(where(any))

-输出

# A tibble: 5 x 2
#  A     C    
#  <lgl> <lgl>
#1 TRUE  TRUE 
#2 TRUE  FALSE
#3 TRUE  TRUE 
#4 TRUE  TRUE 
#5 TRUE  FALSE

根据 OP 的评论,希望保留类型不合逻辑的列以及 logical 类型和 any TRUE

的列
library(purrr)
df %>% 
  select(where(~ is.logical(.) && any(.)), where(negate(is.logical)))

这是最干净的解决方案:

select_if(.tbl = df, .predicate = any)

解释:

  • .predicate - 应用于列,将留下 returned 值全部为 TRUE
  • 的列
  • any - 将 return TRUE 用于任何存在的 TRUE 值。也适用于组合 any(0,-1)。在一种极端情况下,any(0, 0) 会 return FALSE
    • 如果您可能有一个可能只包含 0 的列,您可能需要实施额外的检查。同样,这相当于 any(NULL, NULL)

假设您想避免那些极端情况,更好的选择:

select_if(.tbl = df, .predicate = ~ all(isFALSE(.x)))

基本 R 选项

df[colSums(df)>0]

df[unique(which(as.matrix(df),arr.ind = TRUE)[,"col"])]