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
相关产品推荐
相关产品推荐

