在R中实现多列文本关键词共现统计与交叉制表的方法问询
关键词共现交叉表解决方案
需求说明
针对包含论文标题(TI)和摘要(AB)的数据框,统计**TI列含cancer/CVD与AB列含pancreatic(含变体)/diet**的条目共现情况,生成交叉统计表。
可复现示例数据
# 创建示例数据框 TI <- c('Studies of pancreatic cancer', 'colon, breast, and pancreatic cancer', 'cancer and CVD paper', 'CVD paper' ) AB <- c('Autoimmune pancreatitis (AIP) is now considered a disease to be treated by diet.', 'dietary patterns, positive associations were found between pancreatic cancer risk ', 'Cardiovascular diseases (CVD) is linked to Diet', 'making this match with pancreas' ) df <- data.frame(TI, AB) # 字段说明:TI = 论文标题,AB = 论文摘要
实现步骤
1. 为每条数据添加关键词匹配标记
通过grepl()函数标记每条数据是否命中目标关键词,方便后续统计:
# 标记TI列是否包含cancer或CVD df$TI_has_cancer <- grepl("cancer*", df$TI, ignore.case = TRUE) df$TI_has_CVD <- grepl("CVD", df$TI, ignore.case = TRUE) # 标记AB列是否包含pancreatic变体或diet df$AB_has_pancreatic <- grepl("pancreat*", df$AB, ignore.case = TRUE) df$AB_has_diet <- grepl("diet*", df$AB, ignore.case = TRUE)
2. 生成交叉表
可根据需求选择两种生成方式:
方式1:合并分组的交叉表
将TI列的关键词合并为分组(含cancer、含CVD、同时含两者、都不含),再与AB列的关键词分组做交叉统计:
# 加载dplyr包(未安装则先执行 install.packages("dplyr")) library(dplyr) # 创建TI分组列 df$TI_group <- case_when( df$TI_has_cancer & df$TI_has_CVD ~ "cancer + CVD", df$TI_has_cancer ~ "cancer", df$TI_has_CVD ~ "CVD", TRUE ~ "Neither" ) # 创建AB分组列 df$AB_group <- case_when( df$AB_has_pancreatic & df$AB_has_diet ~ "pancreatic + diet", df$AB_has_pancreatic ~ "pancreatic", df$AB_has_diet ~ "diet", TRUE ~ "Neither" ) # 生成交叉表 cross_table <- table(TI_Group = df$TI_group, AB_Group = df$AB_group) # 查看结果 print(cross_table)
运行后输出结果:
AB_Group TI_Group pancreatic pancreatic + diet diet Neither cancer 0 2 0 0 cancer + CVD 0 0 1 0 CVD 1 0 0 0
方式2:单个关键词的交叉表
如果需要单独查看TI列中cancer/CVD分别与AB列关键词的共现情况,可直接生成两两交叉表:
# TI含cancer vs AB关键词的交叉表 table(TI_Cancer = df$TI_has_cancer, AB_Keyword = df$AB_group) # TI含CVD vs AB关键词的交叉表 table(TI_CVD = df$TI_has_CVD, AB_Keyword = df$AB_group)
补充说明
grepl()比grep()更适合标记,因为它直接返回逻辑值(TRUE/FALSE),方便后续统计- 正则表达式
pancreat*可以匹配pancreatic、pancreatitis、pancreas等变体 - 若需要更美观的表格输出,可以使用
knitr::kable(cross_table)将交叉表转为格式化表格
内容的提问来源于stack exchange,提问作者Erin Giles
相关产品推荐
相关产品推荐

