如何统计R语言数据框中两列多元素单元格的匹配次数?
统计多名字单元格间的匹配次数(R语言)
问题描述
需要统计names_Y列每个单元格中的名字,在对应行names_X单元格中的匹配次数。由于每个单元格包含多个无固定格式的名字(仅用逗号分隔,可能带空格),直接使用str_count函数无法得到正确结果——尝试以下代码后,matches列结果全为0:
示例数据
dt <- data.frame(group = c('A', 'A', 'B', 'B'), names_X = c('James, Robert, Phill', 'James, Blake, Paul', 'Lucy, Macy', 'Lucy, Caty'), names_Y = c('Robert, Peter', 'Robert, Peter', 'Macy, Lucy', 'Caty, Jess, Carla'))
错误尝试代码
dt %>% group_by(group) %>% mutate(matches = str_count(names_X, names_Y))
解决方案
核心思路是先将每个单元格的名字拆分为独立的字符向量,再逐行计算两个向量的交集长度,以此得到匹配次数。使用tidyverse工具链实现如下:
library(tidyverse) dt %>% mutate( # 拆分并清理名字:按逗号+任意空格拆分,去除每个名字的前后空格 x_names = str_split(names_X, ",\\s*") %>% map(str_trim), y_names = str_split(names_Y, ",\\s*") %>% map(str_trim), # 计算每行两个名字列表的交集长度,即匹配次数 matches = map2_int(x_names, y_names, ~length(intersect(.x, .y))) ) %>% # 可选:移除中间生成的临时列 select(-x_names, -y_names)
运行结果
group names_X names_Y matches 1 A James, Robert, Phill Robert, Peter 1 2 A James, Blake, Paul Robert, Peter 1 3 B Lucy, Macy Macy, Lucy 2 4 B Lucy, Caty Caty, Jess, Carla 1
关键说明
str_split(names_X, ",\\s*"):用正则表达式匹配逗号加任意数量的空格作为分隔符,兼容不同格式的名字分隔map(str_trim):确保每个名字没有多余的前后空格,避免因空格导致的匹配失败map2_int:逐行对x_names和y_names两个列表执行交集计算,并返回整数类型的匹配次数
内容的提问来源于stack exchange,提问作者Jef van Cappellen
相关产品推荐
相关产品推荐

