使用 R

问题描述 投票:0回答:2

我想过滤数据框中所有列中的值 FALSE。

我的数据框包含 40 列。每列包含 TRUEFALSENA

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 个。

r dplyr filter many-to-many multiple-columns
2个回答
0
投票

由于这涉及很多

NA
值,混淆了
rowSums
的简单使用,我们可以添加
%in%
的使用:

基础R

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, ]

dplyr

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

0
投票

或者,您可以根据

this question/answer
dplyr使用以下方法:

  • Reduce
    |
    对所有列(按行)进行逻辑或运算,仅当行中的所有元素均为 FALSE
  • 时才为 FALSE
  • !
    反转它,因此
    filter
    只选择所有元素都为 FALSE
  • 的行
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))

library(dplyr)

df1 %>% 
  filter(!Reduce(`|`, select(., col1:col3)))
#>   id  col1  col2  col3
#> 1  9 FALSE FALSE FALSE

创建于 2023-05-03 由 reprex 包 (v1.0.0)

© www.soinside.com 2019 - 2024. All rights reserved.