在R语言中基于共享属名求和合并数据框行的优雅实现方法
按属名分组求和的解决方案
首先,先确保你能正确创建目标数据框(如果你的数据是从外部导入的,比如csv,可以用read.csv("你的文件路径"),这里先给出示例数据的创建代码,方便你测试):
# 创建示例数据框 df <- data.frame( Genera = c("g1", "g1", "g2", "g2"), Species = c("s1", "s2", "s3", "s4"), t1 = c(0, 0, 1, 1), t2 = c(0, 1, 2, 0), t3 = c(1, 1, 0, 0), t4 = c(3, 0, 1, 0), t5 = c(1, 1, 0, 0) )
下面提供两种简单的实现方法,适合R语言新手:
方法一:使用Base R自带的aggregate函数
不需要额外安装包,直接用R内置函数即可完成分组求和:
# 去掉Species列,按Genera分组对剩余列求和 result_base <- aggregate(. ~ Genera, data = df[, -2], sum) print(result_base)
运行后输出结果:
Genera t1 t2 t3 t4 t5 1 g1 0 1 2 3 2 2 g2 2 2 0 1 0
方法二:使用dplyr包(更直观的语法)
dplyr是数据处理常用的包,语法更贴近自然语言,适合新手理解:
# 先安装包(第一次使用时运行) # install.packages("dplyr") # 加载包 library(dplyr) # 分组求和 result_dplyr <- df %>% group_by(Genera) %>% # 按Genera列分组 summarise(across(t1:t5, sum), .groups = "drop") # 对t1到t5列分别求和,最后取消分组状态 print(result_dplyr)
运行后同样会得到你想要的结果。
关于你之前尝试的问题说明
你之前试图删除Species列并将Genera设为行名失败,是因为R要求行名必须唯一,重复的Genera会被自动添加编号。正确的做法是保留Genera作为普通列,通过分组聚合的方式实现求和,这样既保留了属名信息,又能得到各时间列的总和。
内容的提问来源于stack exchange,提问作者Walker Weyland
相关产品推荐
相关产品推荐

