R语言:如何按特殊规则合并两个数据集并拼接promo列
解决R数据合并与汇总的问题
我来帮你搞定这个数据合并需求!这里提供两种常用的实现方式,一种用dplyr包(代码更简洁易读),另一种用base R(无需额外安装包)。
方法一:使用dplyr包(推荐)
先确保你已经安装了dplyr包,如果没安装的话先运行install.packages("dplyr"),然后执行以下代码:
library(dplyr) # 定义原始数据 data1 <- data.frame(store=c(12,13),product=c(1,2)) data2 <- data.frame(product=c(1,1,2,2,2),promo=c("promo1","promo2","promo1","promo2","promo3")) # 核心处理逻辑 final_result <- data1 %>% # 按product字段左连接两个数据集,保留data1的所有记录 left_join(data2, by = "product") %>% # 按store和product分组,确保每个门店-产品组合单独计算 group_by(store, product) %>% # 汇总统计:promo数量 + 拼接promo字符串 summarise( numberofpromo = n(), promo = paste(promo, collapse = ";") ) %>% # 取消分组,转为普通数据框 ungroup() # 查看结果 final_result
运行后就能得到你想要的输出:
# A tibble: 2 × 4 store product numberofpromo promo <dbl> <dbl> <int> <chr> 1 12 1 2 promo1;promo2 2 13 2 3 promo1;promo2;promo3
代码解释:
left_join():保证data1里的所有门店-产品记录都被保留,同时关联上data2中对应product的所有promo信息group_by(store, product):因为data1中每个store对应唯一的product,所以按这两个字段分组,确保每个组合独立计算summarise()里的两个操作:n():统计分组内的行数,也就是该product对应的promo数量paste(promo, collapse = ";"):把分组内的所有promo字符串用分号连接成一个单独的字符串
ungroup():移除分组标记,避免后续操作受到分组状态的影响
方法二:使用base R(无需额外包)
如果不想安装第三方包,可以用base R的函数实现:
# 定义原始数据 data1 <- data.frame(store=c(12,13),product=c(1,2)) data2 <- data.frame(product=c(1,1,2,2,2),promo=c("promo1","promo2","promo1","promo2","promo3")) # 左连接两个数据集 merged_data <- merge(data1, data2, by = "product", all.x = TRUE) # 分组汇总:同时计算数量和拼接字符串 agg_result <- aggregate(promo ~ store + product, data = merged_data, FUN = function(x) { list( numberofpromo = length(x), promo = paste(x, collapse = ";") ) }) # 展开列表列,转为标准数据框结构 final_result_base <- do.call(data.frame, agg_result) names(final_result_base)[3:4] <- c("numberofpromo", "promo") # 查看结果 final_result_base
运行后同样能得到目标数据集:
store product numberofpromo promo 1 12 1 2 promo1;promo2 2 13 2 3 promo1;promo2;promo3
内容的提问来源于stack exchange,提问作者melik
相关产品推荐
相关产品推荐

