R语言中聚合数据框嵌套列并保留原列名的实现方法
解决分组求和并保留原列名的问题
针对你遇到的用aggregate分组求和后列名丢失的问题,这里有两种简单的解决方法,都能让结果完美保留原数据框的列名:
方法1:调整aggregate的输出列名
你可以在调用aggregate时给分组列指定名称,再手动替换结果中求和列的名称,完全匹配原列名:
# 执行分组求和,同时给分组列命名为hex agg_result <- aggregate(df$material_diff, by = list(hex = df$hex), FUN = sum) # 将求和列的名称替换为原数据框中对应的列名 colnames(agg_result)[-1] <- colnames(df)[-1]
运行后agg_result的结构就和你期望的完全一致:
hex material_diff.1 material_diff.2 material_diff.3 1 90 12 9 20 2 250 0 0 0 3 400 0 0 10
方法2:用dplyr实现更简洁的操作
如果你习惯使用tidyverse生态的工具,dplyr的代码会更直观,无需手动调整列名,直接返回带原列名的结果:
library(dplyr) df %>% group_by(hex) %>% summarise(across(starts_with("material_diff"), sum), .groups = "drop")
这里across(starts_with("material_diff"))会自动选中所有以material_diff开头的列,对它们分别求和,分组后自动保留原列名。
为什么原代码会丢失列名?
你最初的aggregate(df$material_diff, by=list(df$hex),FUN=sum)中,by参数的列表没有命名,所以分组列默认叫Group.1;而material_diff是矩阵类型的列,求和后生成的列会被默认命名为V1、V2、V3,通过上面的方法就能轻松修正这个问题。
内容的提问来源于stack exchange,提问作者locket
相关产品推荐
相关产品推荐

