在R中按国家与年份分组,计算var_far1层级对应x1的平均值
如何在R中按多分组层级计算均值并生成新列?
首先,先确认你的原始数据构造代码(方便复现问题):
year<- c(rep(c("1995"),4)) cou <- c(rep(c("AT"),4)) var_far1<- c("A","B", "C", "E") x1 <- c(NA,2,NA,3) var_far2<- c("A","B", "C-E", "C-E") data1<-data.frame(cou,year,var_far1,x1,var_far2) year<- c(rep(c("1996"),4)) cou <- c(rep(c("AT"),4)) var_far1<- c("A","B", "C", "E") x1 <- c(1,2,5,3) var_far2<- c("A","B", "C-E", "C-E") data2<-data.frame(cou,year,var_far1,x1,var_far2) data<-rbind(data1,data2)
你的需求是:按cou(国家)和year(年份)分组,再基于var_far2的分组对对应var_far1层级的x1值求平均,生成新列x1_new。下面给你两种常用的实现方法:
方法一:使用dplyr包(推荐,代码更直观)
dplyr是tidyverse生态中处理数据分组聚合的常用工具,代码可读性很高:
# 先加载dplyr包,如果没安装先运行install.packages("dplyr") library(dplyr) data <- data %>% # 按cou、year、var_far2三层分组 group_by(cou, year, var_far2) %>% # 生成新列x1_new,计算每组x1的均值,忽略NA值 mutate(x1_new = mean(x1, na.rm = TRUE)) %>% # 取消分组(可选,后续操作如果不需要分组可以取消) ungroup() # 查看结果 print(data)
代码解释:
group_by(cou, year, var_far2):指定分组层级,先按国家和年份划分大组,再在每个大组内按var_far2的类别划分小组;mutate(x1_new = mean(x1, na.rm = TRUE)):在保留原数据所有行的前提下,为每个小组计算x1的均值(na.rm = TRUE确保忽略NA值不影响计算),并将结果赋值给新列x1_new;ungroup():取消分组状态,避免后续操作受分组影响。
方法二:使用Base R的ave()函数
如果你不想加载额外包,Base R的ave()函数也能实现同样效果:
data$x1_new <- ave(data$x1, data$cou, data$year, data$var_far2, FUN = function(x) mean(x, na.rm = TRUE)) # 查看结果 print(data)
代码解释:
ave()函数可以针对多个分组变量计算聚合值,并将结果匹配回原数据的每一行;- 第一个参数是要计算的变量
data$x1,后面的参数是分组变量data$cou、data$year、data$var_far2,最后用FUN指定聚合函数为带na.rm=TRUE的均值计算。
运行任意一种方法后,你都会得到符合预期的结果:
cou year var_far1 x1 var_far2 x1_new 1 AT 1995 A NA A NA 2 AT 1995 B 2 B 2.0 3 AT 1995 C NA C-E 3.0 4 AT 1995 E 3 C-E 3.0 5 AT 1996 A 1 A 1.0 6 AT 1996 B 2 B 2.0 7 AT 1996 C 5 C-E 4.0 8 AT 1996 E 3 C-E 4.0
内容的提问来源于stack exchange,提问作者msh855
相关产品推荐
相关产品推荐

