如何用dplyr判断拆分后列表的每个元素是否含指定子串?
用dplyr实现需求的方案
当然可以用dplyr结合stringr来实现,具体步骤如下:
首先加载需要的包:
library(dplyr) library(stringr)
定义你的数据:
string <- c("ABC, BCD, DAB", "BCA, CDA, ABDA") s1 <- "AB" s2 <- "CD"
接下来通过dplyr的链式操作完成判断:
result <- tibble(original = string) %>% # 给每个原始字符串添加索引,方便后续分组 mutate(id = row_number()) %>% # 按", "拆分字符串,把每个子元素拆成单独一行 separate_rows(original, sep = ", ") %>% # 判断每个子元素是否包含s1或s2 mutate(contains_target = str_detect(original, s1) | str_detect(original, s2)) %>% # 按原始字符串的索引分组 group_by(id) %>% # 检查组内所有子元素都满足条件(即所有contains_target都是TRUE) summarise(all_match = all(contains_target)) %>% # 提取最终的逻辑结果向量 pull(all_match) result #> [1] TRUE FALSE
代码说明:
tibble(original = string):把原始字符串向量转换成dplyr友好的数据框格式mutate(id = row_number()):添加行号作为分组依据,确保后续能对应回原始的每个字符串separate_rows(...):将每个逗号分隔的字符串拆分成多行,每个子元素单独占一行str_detect(original, s1) | str_detect(original, s2):判断当前子元素是否包含s1或s2group_by(id):按原始字符串的索引分组,确保我们是对每个原始字符串的所有子元素进行判断all(contains_target):检查组内所有子元素的判断结果是否都是TRUE,只要有一个是FALSE,整个组就返回FALSEpull(all_match):把最终的判断结果提取成向量,和你预期的输出一致
内容的提问来源于stack exchange,提问作者Jirka Čep
相关产品推荐
相关产品推荐

