如何筛选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和预期完全一致:
| name1 | name2 |
|---|---|
| Carlos Lopez Rey | Lopez, Carlos |
| Monica Naranjo Garcia | Monica de Naranjo |
| Alejandro Martinez Amor | Alejandro Martinez de Amor |
逻辑说明
- 首先清洗两列的文本,移除逗号避免标点导致单词匹配失败,如果需要大小写不敏感的匹配,可以在拆分前加一步转小写的操作统一字符格式
- 将清洗后的文本按空格拆分为独立单词列表
- 统计两个单词列表的交集元素数量,保留数量≥2的行即可
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

