使用|(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
frompurr
的方法:
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