在R中提取数据框两字符串列的相同字符(大小写不敏感)
在R语言中提取两字符串列的相同字符
需求说明
现有数据框df,需提取string1与string2列中大小写敏感的相同字符:
- 存在多个相同字符时,将所有匹配字符拼接返回
- 无匹配字符时返回
NA
原始数据
# 原始数据框 string1 string2 1 bDe lDC 2 gj iE 3 Plm DOl 4 QWVe dVtQ
期望输出
# 目标输出 string1 string2 similar 1 bDe lDC D 2 gj iE <NA> 3 Plm DOl l 4 QWVe dVtQ VQ
数据框dput结构
df <- structure(list(string1 = c("bDe", "gj", "Plm", "QWVe"), string2 = c("lDC", "iE", "DOl", "dVtQ")), class = "data.frame", row.names = c(NA, -4L))
解决方案
方法1:Base R实现
自定义函数逐行处理字符串对,拆分字符后找交集并拼接:
# 定义提取相同字符的函数 get_common_chars <- function(s1, s2) { # 拆分字符串为单个字符向量 chars1 <- strsplit(s1, "")[[1]] chars2 <- strsplit(s2, "")[[1]] # 获取两字符串的字符交集 common_chars <- intersect(chars1, chars2) # 结果处理:无交集返回NA,否则拼接字符 if (length(common_chars) == 0) { NA_character_ } else { paste(common_chars, collapse = "") } } # 应用函数生成similar列 df$similar <- mapply(get_common_chars, df$string1, df$string2)
运行后即可得到目标结果:
> df string1 string2 similar 1 bDe lDC D 2 gj iE <NA> 3 Plm DOl l 4 QWVe dVtQ VQ
方法2:Tidyverse实现
结合dplyr与purrr实现管道化操作:
library(dplyr) library(purrr) library(stringr) df <- df %>% mutate(similar = map2_chr(string1, string2, function(x, y) { chars_x <- str_split(x, "")[[1]] chars_y <- str_split(y, "")[[1]] common <- intersect(chars_x, chars_y) if (length(common) == 0) NA_character_ else str_c(common, collapse = "") }))
扩展:忽略大小写匹配
若需忽略大小写提取相同字符(保留原字符格式),可修改函数逻辑:
get_common_chars_case_insensitive <- function(s1, s2) { chars1 <- strsplit(s1, "")[[1]] chars2 <- strsplit(s2, "")[[1]] # 基于小写匹配,保留原字符 match_logic <- tolower(chars1) %in% tolower(chars2) common_chars <- chars1[match_logic] if (length(common_chars) == 0) { NA_character_ } else { paste(common_chars, collapse = "") } } # 应用示例 df$similar_case_insensitive <- mapply(get_common_chars_case_insensitive, df$string1, df$string2)
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

