如何在R中对多列按每n行计算均值并保留分组首行ID?
解决方案
方法1:使用dplyr包(tidyverse风格)
这种方法代码简洁易读,适合熟悉tidyverse生态的用户:
# 先加载dplyr包 library(dplyr) df <- data.frame(ID = c('a', 'b', 'c', 'c1', 'd', 'e', 'f', 'g', 'h', 'h1'), var2 = c(7, 9, 2, 4, 3, 6, 8, 2, 1, 2), var3 = c(21, 50, 40, 30, 29, 45, 33, 51, 70, 46)) df %>% # 按每2行创建分组 group_by(group = rep(1:(nrow(.)/2), each = 2)) %>% # 提取每组首个ID,计算var2和var3的均值 summarise(ID = first(ID), var2 = mean(var2), var3 = mean(var3)) %>% # 移除临时分组列 select(-group)
运行后输出结果:
ID var2 var3 <chr> <dbl> <dbl> 1 a 8 35.5 2 c 3 35 3 d 4.5 37 4 f 5 42 5 h 1.5 58
方法2:使用基础R函数
如果不想加载额外包,可以用基础R实现:
df <- data.frame(ID = c('a', 'b', 'c', 'c1', 'd', 'e', 'f', 'g', 'h', 'h1'), var2 = c(7, 9, 2, 4, 3, 6, 8, 2, 1, 2), var3 = c(21, 50, 40, 30, 29, 45, 33, 51, 70, 46)) # 创建每2行一组的分组变量 groups <- rep(1:(nrow(df)/2), each = 2) # 生成结果数据框 result <- data.frame( # 提取每组的第一个ID ID = df$ID[!duplicated(groups)], # 计算每组var2的均值 var2 = tapply(df$var2, groups, mean), # 计算每组var3的均值 var3 = tapply(df$var3, groups, mean) ) # 重置行名(可选) rownames(result) <- NULL print(result)
输出结果:
ID var2 var3 1 a 8.0 35.5 2 c 3.0 35.0 3 d 4.5 37.0 4 f 5.0 42.0 5 h 1.5 58.0
内容的提问来源于stack exchange,提问作者Loz
相关产品推荐
相关产品推荐

