如何在R中基于另一列字符串检测汇总列值并存入新数据框
解决方案:按多主题关键词汇总资助金额
问题核心
你遇到的关键问题是原数据集的「主题」列是多关键词拼接的字符串,直接用str_detect或%in%会因向量长度不匹配、匹配逻辑错误导致失败。正确思路是先把多主题拆分为单独行,再按关键词分组汇总。
完整实现步骤
先确保加载tidyverse包(包含数据处理所需的dplyr和tidyr):
library(tidyverse)
1. 数据预处理
首先清理资助金额列(去除空格并转为数值型):
# 示例数据(替换为你的实际df) df <- data.frame( 项目 = c("Project 1", "Project 2", "Project 3", "Project 4", "Project 5"), 主题 = c("Agriculture, Water, Food", "Agriculture, Digital", "Agriculture, Food", "Urban planning, Food, Water, Digital", "Agriculture"), 资助金额 = c("50 000", "100 000", "50 000", "200 000", "30 000") ) # 清洗资助金额:去掉空格,转为数值 df$资助金额 <- as.numeric(gsub(" ", "", df$资助金额))
2. 拆分多主题为独立行
用separate_rows将每个主题拆成单独行,同时保留对应资助金额:
df_split <- df %>% separate_rows(主题, sep = ", ") # 分隔符匹配你的数据格式:逗号+空格
拆分后的数据结构会变成每个主题对应一行项目记录,方便后续分组统计。
3. 按关键词分组汇总
直接按主题分组,统计出现次数和总资助金额:
themes_analysis <- df_split %>% group_by(主题) %>% summarise( 出现次数 = n(), 总资助金额 = sum(资助金额) ) %>% rename(关键词 = 主题) # 重命名列名匹配期望结果
运行后得到的themes_analysis就是你需要的结果:
| 关键词 | 出现次数 | 总资助金额 |
|---|---|---|
| Agriculture | 4 | 230000 |
| Water | 2 | 250000 |
| Food | 3 | 300000 |
| Digital | 2 | 300000 |
| Urban planning | 1 | 200000 |
之前代码出错原因
str_detect向量不匹配:df$Themes(312行)和themes_analysis$Keywords(93行)长度不一致,R无法自动循环匹配,触发回收错误。%in%逻辑错误:df$Themes是包含多关键词的字符串,%in%是完全匹配,无法检测字符串中是否包含单个关键词。sum未分组:直接调用sum会计算所有符合条件的总和,没有按单个关键词单独汇总,导致每行结果相同。
内容的提问来源于stack exchange,提问作者jchd
相关产品推荐
相关产品推荐

