在 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 R
与 Filter
和 any
结合使用
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"])]
我有一个数据框,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 R
与 Filter
和 any
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
- 将 returnTRUE
用于任何存在的TRUE
值。也适用于组合any(0,-1)
。在一种极端情况下,any(0, 0)
会 returnFALSE
。- 如果您可能有一个可能只包含
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"])]