使用|(OR)而不是&;链接筛选器(Cross())语句;(及)

使用|(OR)而不是&;链接筛选器(Cross())语句;(及),r,dplyr,R,Dplyr,如何筛选数据帧df中一个或多个列符合条件的所有行。例如:至少有一个细胞NA在哪里 df <- tibble(a = c('x', 'x', 'x'), b = c(NA, 'x', 'x'), c = c(NA, NA, 'x')) columns_to_check <- c('b', 'c') 但是(如何)我可以使用OR将用cross()创建的filter()语句组合起来?下面是一种使用reducefrompurr的方法

如何筛选数据帧
df
中一个或多个
列符合条件的所有行。例如:至少有一个细胞NA在哪里


df <- tibble(a = c('x', 'x', 'x'),
             b = c(NA,  'x', 'x'),
             c = c(NA,   NA, 'x'))
columns_to_check <- c('b', 'c')

但是(如何)我可以使用OR将用
cross()
创建的
filter()
语句组合起来?

下面是一种使用
reduce
from
purr
的方法:

df %>%
  filter(reduce(.x = across(all_of(columns_to_check), ~ !is.na(.x)), .f = `|`))
这是因为跨
返回长度
nrow(df)
的逻辑向量列表

mutate
中执行时,可以看到该行为:

df %>%
+   mutate(across(all_of(columns_to_check), ~ !is.na(.x)))

# A tibble: 3 x 3
  a     b     c    
  <chr> <lgl> <lgl>
1 x     FALSE FALSE
2 x     TRUE  FALSE
3 x     TRUE  TRUE 
df%>%
+变异(跨越(列到检查列的所有列)~!is.na(.x)))
#一个tibble:3x3
a、b、c
1 x假假假
2倍真假
3倍真实
因此,您可以将它们与
|
一起减少,以获得一个逻辑向量。您不需要
.x
.f
,它们仅用于说明目的

我的错误,这在
vignette(“rowwise”)
中有记录:


另一个解决办法可以是:

df %>%
 filter(across(all_of(columns_to_check), ~ !is.na(.x)) == TRUE)

  a     b     c    
  <chr> <chr> <chr>
1 x     x     <NA> 
2 x     x     x    
df%>%
过滤器(跨越(列到检查的所有列),~!is.na(.x))==TRUE)
a、b、c
1 x x
2 x x x

谢谢!这比
rowSums()
方法更清楚,因为它使
更明确。但是
rowSums
方法几乎肯定更快。
df %>%
  filter(rowSums(across(all_of(columns_to_check), ~ !is.na(.x))) > 0)
df %>%
 filter(across(all_of(columns_to_check), ~ !is.na(.x)) == TRUE)

  a     b     c    
  <chr> <chr> <chr>
1 x     x     <NA> 
2 x     x     x