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

如何筛选R语言DataFrame中两列共同词数≥2的行?

实现代码(tidyverse 版本,易读性高)

首先加载依赖包、导入示例数据:

library(dplyr)
library(purrr)
library(stringr)

# 原始数据
df <- data.frame(name1 = c("Carlos Lopez Rey", "Monica Naranjo Garcia", "Antonio Perez Reverte", "Alejandro Martinez Amor", "Iñigo Muruzabal"), 
                 name2 = c("Lopez, Carlos", "Monica de Naranjo", "Garcia, Antonio", "Alejandro Martinez de Amor", "Muruzabal, Javier"))

定义逐行计算共同单词数的函数,再筛选符合条件的行:

# 计算两个字符串的共同单词数量
count_common <- function(x, y) {
  # 先去掉文本中的逗号,避免标点影响单词匹配,再按空格拆分单词
  words_x <- str_split(str_remove_all(x, ","), "\\s+")[[1]]
  words_y <- str_split(str_remove_all(y, ","), "\\s+")[[1]]
  # 返回交集单词的数量
  length(intersect(words_x, words_y))
}

# 筛选共同单词数≥2的行
result <- df %>%
  filter(map2_int(name1, name2, count_common) >= 2)

实现代码(基础R版本,无需额外依赖)

# 原始数据
df <- data.frame(name1 = c("Carlos Lopez Rey", "Monica Naranjo Garcia", "Antonio Perez Reverte", "Alejandro Martinez Amor", "Iñigo Muruzabal"), 
                 name2 = c("Lopez, Carlos", "Monica de Naranjo", "Garcia, Antonio", "Alejandro Martinez de Amor", "Muruzabal, Javier"))

# 逐行计算共同单词数
common_num <- mapply(function(a, b) {
  words_a <- strsplit(gsub(",", "", a), "\\s+")[[1]]
  words_b <- strsplit(gsub(",", "", b), "\\s+")[[1]]
  length(intersect(words_a, words_b))
}, df$name1, df$name2)

# 筛选结果
result <- df[common_num >= 2, ]

输出结果

运行上述代码后得到的result和预期完全一致:

name1name2
Carlos Lopez ReyLopez, Carlos
Monica Naranjo GarciaMonica de Naranjo
Alejandro Martinez AmorAlejandro Martinez de Amor

逻辑说明

  1. 首先清洗两列的文本,移除逗号避免标点导致单词匹配失败,如果需要大小写不敏感的匹配,可以在拆分前加一步转小写的操作统一字符格式
  2. 将清洗后的文本按空格拆分为独立单词列表
  3. 统计两个单词列表的交集元素数量,保留数量≥2的行即可

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:27:02