如何合并含相似关键词的行并求和?基于Quanteda文本挖掘数据
解决方案
假设你的kwic输出数据集名为kwic_df,包含docname、keyword、my_dict、n(词频计数)字段,以下是实现需求的代码:
1. 过滤climate_change子类别并分组求和
先筛选出my_dict为climate_change的数据,再对目标关键词分组并计算总词频:
library(dplyr) library(stringr) library(tidyr) # 筛选子类别+添加分组标识 df_climate <- kwic_df %>% filter(my_dict == "climate_change") %>% mutate( group = case_when( # 精准匹配1.5、1.5 degree、1.5 degrees,排除1.55这类无关项 str_detect(keyword, "^1\\.5( degree[s]?)?$") ~ "1.5_degree_group", # 匹配所有以climate或climate-开头的关键词 str_detect(keyword, "^climate(-.*)?$") ~ "climate_base_group", # 其他关键词保留原名称作为分组 TRUE ~ keyword ) ) %>% # 按文档、字典类别、分组求和词频 group_by(docname, my_dict, group) %>% summarise(total_n = sum(n), .groups = "drop")
2. 转换为宽表格式并计算类别总词频
使用pivot_wider完成长表转宽表,同时计算每个字典类别的整体词频:
# 转成指定宽表格式,无匹配的词频填0 wide_df <- df_climate %>% pivot_wider( id_cols = c(docname, my_dict), names_from = group, values_from = total_n, values_fill = 0 ) # 计算climate_change子类别的各分组总词频 category_total <- wide_df %>% group_by(my_dict) %>% summarise(across(-docname, sum), .groups = "drop")
关键细节说明
- 正则
^1\\.5( degree[s]?)?$通过锚定开头结尾,确保只匹配目标1.5相关关键词,自动排除1.55、1.56这类无关项; - 正则
^climate(-.*)?$覆盖所有以climate或climate-开头的变体(如climate crisis、climate-action等); - 若不需要保留其他未分组的关键词,可删除
case_when中的TRUE ~ keyword行,仅保留前两组。
内容的提问来源于stack exchange,提问作者shasbot
相关产品推荐
相关产品推荐

