You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:15:33