R语言实现dataframe新增列统计行内匹配词表的唯一词数
R实现逐行统计文本列匹配指定词表的唯一词数量
你可以通过「逐行拆分文本-去重-和目标词表取交集-统计交集长度」的逻辑实现需求,下面给出两种常用实现方式:
测试数据
首先复现示例用到的测试数据集:
person_id <- c("001", "002", "003") grocery_list <- c("apple orange orange kiwi", "eggs milk apple apple", "apple orange banana") df <- data.frame(person_id, grocery_list) fruit_list <- c("apple", "orange", "banana")
方法1:Base R 实现(无第三方依赖)
不需要安装任何扩展包,直接用R内置函数即可完成计算:
df$fruit_count <- sapply( strsplit(df$grocery_list, split = " "), function(line_words) { # 对当前行的词汇去重,和目标词表取交集,统计交集元素个数 length(intersect(unique(line_words), fruit_list)) } )
运行后打印df即可得到预期输出:
person_id grocery_list fruit_count 1 001 apple orange orange kiwi 2 2 002 eggs milk apple apple 1 3 003 apple orange banana 3
方法2:Tidyverse 实现(适配管道工作流)
如果你平时用dplyr生态处理数据,可以用下面的写法,逻辑和Base R版本完全一致:
library(dplyr) library(stringr) df <- df %>% rowwise() %>% mutate( fruit_count = length(intersect(unique(str_split_1(grocery_list, " ")), fruit_list)) ) %>% ungroup()
场景适配提示
- 如果你的文本是多空格、制表符等任意空白分隔,可以把拆分参数从
" "改成正则"\\s+",适配所有空白分隔场景 - 如果需要忽略大小写匹配,可以在取交集前,把拆分得到的词汇统一转成小写(用
tolower()函数),和同样转成小写的目标词表做匹配即可,避免大小写差异导致的匹配遗漏
内容的提问来源于stack exchange,提问作者RStudent
相关产品推荐
相关产品推荐

