在R中基于Title和Date列新增追踪重复匹配的列
解决方案
问题根源
你用aggregate搭配paste的代码没达到预期,是因为没有对Country做去重处理——它会把同一Title+Date分组下所有重复的国家名称都拼接进去,而你需要的是唯一值的汇总。
改进方案
1. Base R 版本
先分组提取唯一的国家名称再拼接,最后合并回原数据(保留所有200多列):
# 按Title+Date分组,提取唯一Country并拼接 x <- aggregate(Country ~ Title + Date, df, function(countries) { paste(unique(countries), collapse = ", ") }) names(x)[3] <- "Total_Countries" # 合并回原数据集,保留所有原有列 df <- merge(df, x, by = c("Title", "Date"), all.x = TRUE)
2. dplyr 版本(更简洁)
如果习惯tidyverse语法,用分组后直接新增列的方式,操作更直观:
library(dplyr) df <- df %>% group_by(Title, Date) %>% mutate(Total_Countries = paste(unique(Country), collapse = ", ")) %>% ungroup()
3. data.table 版本(大数据集更高效)
你的数据集有200多列,要是行数也很多,用data.table的速度会快很多:
library(data.table) setDT(df) # 按Title+Date分组,新增Total_Countries列 df[, Total_Countries := paste(unique(Country), collapse = ", "), by = .(Title, Date)]
额外优化(可选)
如果需要让Total_Countries里的国家名称按字母排序,把unique(x)改成sort(unique(x))即可,比如:
# 以dplyr为例 df <- df %>% group_by(Title, Date) %>% mutate(Total_Countries = paste(sort(unique(Country)), collapse = ", ")) %>% ungroup()
内容的提问来源于stack exchange,提问作者beddotcom
相关产品推荐
相关产品推荐

