如何从两个向量中提取匹配字符?R语言技术问询
提取字符串中的共同字符解决方案
问题说明
需要对数据框每行的两个字符串列,提取二者包含的共同字符;若存在多个匹配项,返回列表形式即可。
示例数据
x <- c("abcde", "lmnop") y <- c("efghi", "uvmxw") df <- data.frame(x, y)
错误尝试分析
你之前用的unique(x, y)无法实现需求,因为unique()的作用是去除向量内的重复值,并非寻找两个字符串的字符交集。
正确解法
方法1:Tidyverse 工具链(返回列表列)
利用dplyr处理数据框,stringr拆分字符串,purrr逐行处理:
library(dplyr) library(stringr) library(purrr) df_result <- df |> mutate(z = map2(x, y, ~ intersect(str_split(.x, "")[[1]], str_split(.y, "")[[1]])))
运行后z列会以列表形式存储每行的共同字符,单个匹配时是长度为1的向量,多个匹配时是包含所有共同字符的向量。
方法2:Tidyverse 工具链(合并为字符串)
如果希望将多个共同字符合并成单个字符串(比如匹配到"b"和"c"时返回"bc"),可以用map2_chr替换map2:
df_result <- df |> mutate(z = map2_chr(x, y, ~ paste(intersect(str_split(.x, "")[[1]], str_split(.y, "")[[1]]), collapse = "")))
方法3:Base R 实现(返回列表列)
无需加载额外包,用mapply逐行处理:
df$z <- mapply(function(a, b) intersect(strsplit(a, "")[[1]], strsplit(b, "")[[1]]), df$x, df$y)
方法4:Base R 实现(合并为字符串)
df$z <- mapply(function(a, b) paste(intersect(strsplit(a, "")[[1]], strsplit(b, "")[[1]]), collapse = ""), df$x, df$y)
结果验证
以上方法处理示例数据后,都会得到符合预期的结果:
x y z 1 abcde efghi e 2 lmnop uvmxw m
内容的提问来源于stack exchange,提问作者writer_typer
相关产品推荐
相关产品推荐

