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

使用aggregate函数聚合后inner join行数异常及保留其他列问题

合并后行数超过预期的原因
  • 正常关联逻辑下的行数预期:inner_join是按关联键匹配所有符合条件的行,属于1对多关联:你的new1中每个customer_id仅对应1条均值记录,但原数据df中同一个customer_id对应多条交易记录,每一条原表记录都会匹配到new1中对应客户的均值,正常关联后行数应该和原df行数一致(1000万行)。
  • 出现1200万行异常的核心原因:
    • 首先检查你的new1表是否存在重复的customer_id:你写的aggregate(df[,12], list(df$customer_id), mean)返回的结果默认分组列名为Group.1,聚合值列名为x,本身没有customer_id字段。如果你没有手动把Group.1重命名为customer_id就直接做关联,会触发笛卡尔积匹配,导致行数异常膨胀。
    • 如果你已经做了重命名操作还是行数异常,可执行length(unique(new1$customer_id))对比nrow(new1),如果两者不等说明你的聚合操作本身没有得到去重的客户记录,大概率是分组字段存在空值、或者聚合参数写错导致的重复。
聚合时保留其余同值列的方法

你提到同一个customer_id对应的其他字段取值都相同,不需要额外做join关联,直接在聚合阶段就可以把这些字段全部保留,两种常用写法如下:

  1. 基于原生aggregate函数实现:把你要保留的其他列也放到分组参数里即可,因为同客户这些列取值相同,不会影响分组逻辑:
    # 示例中col1、col2、col3替换为你需要保留的同值列名即可
    new_df <- aggregate(payment ~ customer_id + col1 + col2 + col3, data = df, FUN = mean)
    
    该方法返回的结果直接就是每个customer_id唯一的一行,同时包含支付均值和其余所有同值字段,无需二次关联。
  2. 基于dplyr语法实现,可读性更高:
    library(dplyr)
    new_df <- df %>%
      group_by(customer_id, col1, col2, col3) %>% # 把所有同客户取值一致的列都放到group_by中
      summarise(payment_mean = mean(payment), .groups = "drop")
    
    得到的new_df就是最终需要的500万行唯一客户记录,同时包含所有要求的字段。

内容的提问来源于stack exchange,提问作者hereforadoubt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:57:03