You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:14:07