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

R语言如何按条件折叠dataframe行并按id3字段聚合数值

实现方案

使用dplyr包处理即可,适配大数据量场景,无需手动指定任何id值过滤,操作步骤如下:

1. 加载依赖包

如果没有安装过dplyr先执行安装,之后加载:

# install.packages("dplyr")
library(dplyr)

2. 折叠重复行(第一阶段输出)

你的示例中第2、3行的id1、id2、id3完全一致,数值列也完全相同,直接按id类列去重即可实现折叠:

df_step1 <- df %>% 
  distinct(id1, id2, id3, .keep_all = TRUE)

如果实际场景中,id类列重复的行数值列取值不同,需要合并时对数值列求和,可以用以下代码替换:

df_step1 <- df %>%
  group_by(id1, id2, id3) %>%
  summarise(across(starts_with("n"), sum), .groups = "drop")

运行后得到的df_step1就是你需要的第一阶段结果:

id1  id2 id3 n1 n2 n3 n4
1   a <NA>   a  2  2  0  0
2   b    a   a  2  1  1  1
3   c <NA>   e  3  1  3  2

3. 按id3聚合(最终输出)

按id3分组,对所有数值列求和,id1取该分组内id2为NA的对应值即可:

df_final <- df_step1 %>%
  group_by(id3) %>%
  summarise(
    id1 = id1[is.na(id2)][1],
    across(starts_with("n"), sum)
  ) %>%
  relocate(id1, .before = id3) # 调整列顺序和你期望的输出对齐

运行后得到的df_final结果如下:

# A tibble: 2 × 6
  id1   id3      n1    n2    n3    n4
  <chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 a     a         4     3     1     1
2 c     e         3     1     3     2

方案说明

  • 全程无硬编码的id值,自动适配所有不同的拉丁名称分组
  • dplyr的分组聚合做了性能优化,处理大体积数据比基础包aggregate效率更高
  • 如果你的列命名规则和示例不同,只需要调整starts_with("n")为你的数值列匹配规则,distinct的参数调整为你的id类列即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:57:01