我有以下数据:
data <- data.frame(name1 =c("John Smith", "A A", "A B", "A C", "John Donovan", "A F", "A D", "A F", "A D", "A C"),
name2 = c("A V", "John Smith", "A D", "A R", "A O", "John Smith", "A M", "A V", "A L", "A Q"),
name3 = c("John Donovan", "A R", "John Donovan", "A L", "A V", "A Q", "A T", "A N", "A L", "A X"))
> data
name1 name2 name3
1 John Smith A V John Donovan
2 A A John Smith A R
3 A B A D John Donovan
4 A C A R A L
5 John Donovan A O A V
6 A F John Smith A Q
7 A D A M A T
8 A F A V A N
9 A D A L A L
10 A C A Q A X
我想在所有列中过滤所有包含字符串“ John”的行(列数可以大于3)。
我尝试以下
data %>%
filter(across(everything()), !str.detect("John"))
但是,它不起作用,并且会产生:
Error: Problem with `filter()` input `..1`.
x Input `..1$name1` must be a logical vector, not a character.
i Input `..1` is `across(everything())`.
您有任何想法吗,尤其是使用跨函数的想法。
filter采用逻辑向量,因此在使用cross时,您需要将该函数传递给cross调用,以将该函数应用于所有选定列:
df %>% filter(across(everything(), ~ !str_detect(., "John")))
V1 V2 V3
1 A C A R A L
2 A D A M A T
3 A F A V A N
4 A D A L A L
5 A C A Q A X
使用@ekoam的评论中提出的解决方案:
df %>% filter(rowSums(across(everything(), ~ str_detect(., "John"))) > 0)
V1 V2 V3
1 John Smith A V John Donovan
2 A A John Smith A R
3 A B A D John Donovan
4 John Donovan A O A V
5 A F John Smith A Q
只是为了使图片更清晰:
df %>% filter(print(across(everything(), ~ !str_detect(., "John"))))
# A tibble: 10 x 3
V1 V2 V3
<lgl> <lgl> <lgl>
1 FALSE TRUE FALSE
2 TRUE FALSE TRUE
3 TRUE TRUE FALSE
4 TRUE TRUE TRUE
5 FALSE TRUE TRUE
6 TRUE FALSE TRUE
7 TRUE TRUE TRUE
8 TRUE TRUE TRUE
9 TRUE TRUE TRUE
10 TRUE TRUE TRUE
V1 V2 V3
1 A C A R A L
2 A D A M A T
3 A F A V A N
4 A D A L A L
5 A C A Q A X
请注意,filter&
按行(和)布尔值,即仅TRUE
选择具有所有值的行,而至少具有所有值的行将不被选择FALSE
。现在,让我们看一下注释中提供的代码:
df %>% filter(print(across(everything(), ~ str_detect(., "John"))))
# A tibble: 10 x 3
V1 V2 V3
<lgl> <lgl> <lgl>
1 TRUE FALSE TRUE
2 FALSE TRUE FALSE
3 FALSE FALSE TRUE
4 FALSE FALSE FALSE
5 TRUE FALSE FALSE
6 FALSE TRUE FALSE
7 FALSE FALSE FALSE
8 FALSE FALSE FALSE
9 FALSE FALSE FALSE
10 FALSE FALSE FALSE
[1] V1 V2 V3
<0 rows> (or 0-length row.names)
所有行均具有至少一个FALSE
,因此未选择任何行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句