gpt4 book ai didi

r - 过滤所有列中包含特定字符串的行(使用 dplyr)

转载 作者:行者123 更新时间:2023-12-02 16:24:17 41 4
gpt4 key购买 nike

我有以下数据:

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 采用逻辑向量,因此在使用 across 时,您需要将函数传递给 across 调用,以便在所有选定列上应用该函数:

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

请注意,过滤器是按行&(和) bool 值,即只有具有所有 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,因此没有选择任何行。

关于r - 过滤所有列中包含特定字符串的行(使用 dplyr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64844859/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com