You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:57:57