基于名称列表,找出文本列含但names.in.text列缺失的名称
问题描述
现有两个R数据框:
data = data.frame("text" = c("John met Jay who met Jack who met Josh who met Jamie", "John and Jay and Jack and Josh and Jamie"), "names.in.text" = c("Jay; Jack; Josh; Jamie", "John; Jack; Josh; Jamie"), "missing.names" = c("",""))
names = data.frame("names" = c("John", "Jay", "Jack", "Josh", "Jamie"))
需要实现:以names$names为名称全集,判断data$names.in.text是否包含data$text中的所有名称,并将data$text中存在但data$names.in.text中缺失的名称填充到data$missing.names列,期望输出如下:
text names.in.text missing.names 1 John met Jay who met Jack who met Josh who met Jamie Jay; Jack; Josh; Jamie John 2 John and Jay and Jack and Josh and Jamie John; Jack; Josh; Jamie Jay
也可采用其他能直观展示文本列有但names.in.text列缺失名称的形式。
解决方案
可以结合dplyr和stringr包实现需求,步骤如下:
- 加载所需工具包:
library(dplyr) library(stringr)
- 定义辅助函数,用于提取文本中的目标名称并对比找出缺失项:
find_missing_names <- function(text_str, names_in_text_str, name_list) { # 从text中提取全集内的名称 text_names <- str_extract_all(text_str, paste(name_list, collapse = "|")) %>% unlist() %>% unique() # 拆分names.in.text中的名称列表 listed_names <- str_split(names_in_text_str, "; ")[[1]] # 筛选出text中有但names.in.text里没有的名称 missing <- setdiff(text_names, listed_names) # 拼接成字符串返回 paste(missing, collapse = "; ") }
- 逐行处理数据框,填充缺失名称:
data <- data %>% rowwise() %>% mutate(missing.names = find_missing_names(text, names.in.text, names$names)) %>% ungroup()
- 查看处理结果:
print(data)
输出与预期一致:
text names.in.text missing.names 1 John met Jay who met Jack who met Josh who met Jamie Jay; Jack; Josh; Jamie John 2 John and Jay and Jack and Josh and Jamie John; Jack; Josh; Jamie Jay
如果偏好基础R语法,也可以用循环实现:
# 基础R版本实现 name_list <- names$names for (i in 1:nrow(data)) { text_names <- unique(str_extract_all(data$text[i], paste(name_list, collapse = "|"))[[1]]) listed_names <- str_split(data$names.in.text[i], "; ")[[1]] data$missing.names[i] <- paste(setdiff(text_names, listed_names), collapse = "; ") }
内容的提问来源于stack exchange,提问作者user17661126
相关产品推荐
相关产品推荐

