如何同时使用 filter across 和 str_detect 对多列进行条件过滤

How to use filter across and str_detect together to filter conditional on mutlitple columns

我有这个数据框:

df <- structure(list(col1 = c("Z2", "A2", "B2", "C2", "A2", "E2", "F2", 
"G2"), col2 = c("Z2", "Z2", "A2", "B2", "C2", "D2", "A2", "F2"
), col3 = c("A2", "B2", "C2", "D2", "E2", "F2", "G2", "Z2")), class = "data.frame", row.names = c(NA, -8L))

> df
  col1 col2 col3
1   Z2   Z2   A2
2   A2   Z2   B2
3   B2   A2   C2
4   C2   B2   D2
5   A2   C2   E2
6   E2   D2   F2
7   F2   A2   G2
8   G2   F2   Z2

我想在 tidyverse 设置中明确使用 filteracrossstr_detect 来过滤所有以 A 开头的行col1:col3.

预期结果:

  col1 col2 col3
1   Z2   Z2   A2
2   A2   Z2   B2
3   B2   A2   C2
4   A2   C2   E2
5   F2   A2   G2

我试过了:

library(dplyr)
library(stringr)
df %>% 
    filter(across(c(col1, col2, col3), ~str_detect(., "^A")))

这给出:

[1] col1 col2 col3
<0 Zeilen> (oder row.names mit Länge 0)

我想了解为什么此代码无法使用 filteracrossstr_detect!

我们可以使用 if_any,因为 across 将查找 & 条件,即所有列都应满足特定行的条件才能获得 filtered

library(dplyr)
library(stringr)
df %>% 
    filter(if_any(everything(), ~str_detect(., "^A"))) 

-输出

   col1 col2 col3
1   Z2   Z2   A2
2   A2   Z2   B2
3   B2   A2   C2
4   A2   C2   E2
5   F2   A2   G2

根据?across

if_any() and if_all() apply the same predicate function to a selection of columns and combine the results into a single logical vector: if_any() is TRUE when the predicate is TRUE for any of the selected columns, if_all() is TRUE when the predicate is TRUE for all selected columns.

across() supersedes the family of "scoped variants" like summarise_at(), summarise_if(), and summarise_all().

if_any/if_all 不属于范围变体