gpt4 book ai didi

r - filter() 中的 str_split()

转载 作者:行者123 更新时间:2023-12-04 02:31:00 25 4
gpt4 key购买 nike

我有一个带有 ID (V1) 的数据框和一些包含具有逗号分隔值的字符串的列,即“a,b”(V2)。我想根据任何值向量与此字符串中任何值之间的匹配来过滤数据框。我还想保留任何其他列而不明确命名它们 (V3)。

df <- data.frame(V1 = 1:4, V2 = c("a,b", letters[1:3]), V3 = letters[20:23])
head(df)
V1 V2 V3
1 1 a,b t
2 2 a u
3 3 b v
4 4 c w

输出应包含任何行,其中 V2 的至少一部分与值向量中的至少一个值匹配。即,如果标准是 c("a","b"),则应完整保留第 1:3 行;如果标准是 c("a","d"),则应保留 1:2 行等。我还想在 V2 中保留完整的字符串。

我知道我可以使用 separate_rows,过滤分离的行,然后再次汇总(或聚合)数据框:

df %>% 
separate_rows(V2, sep = ",") %>%
group_by_at(setdiff(names(df), "V2")) %>%
filter(V2 %in% c("a", "b")) %>%
summarise(paste(V2, collapse=","))

# A tibble: 3 x 3
# Groups: V1 [3]
V1 V3 `paste(V2, collapse = ",")`
<int> <chr> <chr>
1 1 t a,b
2 2 u a
3 3 v b

但是,这样做的缺点是无法保留原始字符串。当并非字符串的所有部分都包含在条件中时,这会有所不同:

df %>% 
separate_rows(V2, sep = ",") %>%
group_by_at(setdiff(names(df), "V2")) %>%
filter(V2 %in% c("a", "d")) %>%
summarise(paste(V2, collapse=","))

# A tibble: 2 x 3
# Groups: V1 [2]
V1 V3 `paste(V2, collapse = ",")`
<int> <chr> <chr>
1 1 t a
2 2 u a

我想知道是否有直接在 filter() 中使用 str_split() 或类似函数的解决方案。因为这会为字符串的每个部分返回一个 TRUE/FALSE 值,所以我尝试使用 any() 组合它们。但是,这不起作用,因为它应用于整个数据帧中 str_split() 返回的任何值:

# This does not include comma-separated values
df %>%
filter(
str_split(V2, ",") %in% c("a", "b")
)
V1 V2 V3
1 2 a u
2 3 b v

# This does not filter out non-matching values
df %>%
filter(
any(str_split(V2, ",") %in% c("a", "b"))
)
V1 V2 V3
1 1 a,b t
2 2 a u
3 3 b v
4 4 c w

最佳答案

也许这种方法可以帮助您处理原始数据(请注意,我更新了您在评论中提到的 df)。

想法是首先在 V2 上使用 str_split 将其转换为列表,然后使用 map_lgl 循环列表str_detect 包裹在 any 中,每行返回一个 TRUEFALSE。在 str_detect 中,我们通过将它们包装在 ^$ 中来寻找 ab 的精确匹配。我们可以在 filter 中完成这一切,而无需添加新变量。

library(tidyverse)

df <- data.frame(V1 = 1:4, V2 = c("a,b", "a", "b", "aba"), V3 = letters[20:23])

df %>%
filter(map_lgl(str_split(V2, ","),
~ any(str_detect(.x, "^a$|^b$"))))
#> V1 V2 V3
#> 1 1 a,b t
#> 2 2 a u
#> 3 3 b v

reprex package 创建于 2020-10-03 (v0.3.0)

关于r - filter() 中的 str_split(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64184357/

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