我想过滤数据框中所有列中的值 FALSE。
我的数据框包含 40 列。每列包含 TRUE 或 FALSE 或 NA
df1 <- data.frame(id=1:10, col1=c(T, F, NA, T, F, F, NA, NA, F, T), col2=c(T, T, F, F, NA, T, F, NA, F, T),col3=c(F, F, NA, NA, NA, T, T, F, F, T))
id col1 col2 col3
1 1 TRUE TRUE FALSE
2 2 FALSE TRUE FALSE
3 3 NA FALSE NA
4 4 TRUE FALSE NA
5 5 FALSE NA NA
6 6 FALSE TRUE TRUE
7 7 NA FALSE TRUE
8 8 NA NA FALSE
9 9 FALSE FALSE FALSE
10 10 TRUE TRUE TRUE
我只是想过滤掉所有列中的FALSE
谢谢你的帮助
如果我的专栏少于 10 个很容易,但我的专栏有 40 个。
由于这涉及很多
NA
值,混淆了 rowSums
的简单使用,我们可以添加 %in%
的使用:
df1[rowSums(!sapply(df1[-1], `%in%`, FALSE)) > 0,]
# id col1 col2 col3
# 1 1 TRUE TRUE FALSE
# 2 2 FALSE TRUE FALSE
# 3 3 NA FALSE NA
# 4 4 TRUE FALSE NA
# 5 5 FALSE NA NA
# 6 6 FALSE TRUE TRUE
# 7 7 NA FALSE TRUE
# 8 8 NA NA FALSE
# 10 10 TRUE TRUE TRUE
或者,感谢 zx8754:
df1[ rowSums(df1[ , 2:4] == FALSE, na.rm = TRUE) != 3, ]
library(dplyr)
df1 %>%
filter(!if_all(col1:col3, ~ . %in% FALSE))
# id col1 col2 col3
# 1 1 TRUE TRUE FALSE
# 2 2 FALSE TRUE FALSE
# 3 3 NA FALSE NA
# 4 4 TRUE FALSE NA
# 5 5 FALSE NA NA
# 6 6 FALSE TRUE TRUE
# 7 7 NA FALSE TRUE
# 8 8 NA NA FALSE
# 9 9 FALSE FALSE FALSE
或者,您可以根据
this question/answer对
dplyr
使用以下方法:
Reduce
与 |
对所有列(按行)进行逻辑或运算,仅当行中的所有元素均为 FALSE!
反转它,因此 filter
只选择所有元素都为 FALSEdf1 <- data.frame(id=1:10, col1=c(T, F, NA, T, F, F, NA, NA, F, T), col2=c(T, T, F, F, NA, T, F, NA, F, T),col3=c(F, F, NA, NA, NA, T, T, F, F, T))
library(dplyr)
df1 %>%
filter(!Reduce(`|`, select(., col1:col3)))
#> id col1 col2 col3
#> 1 9 FALSE FALSE FALSE
创建于 2023-05-03 由 reprex 包 (v1.0.0)