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

如何创建函数计算数据框子集的列均值?R语言技术求助

按分组计算多列均值的问题解决

问题背景

示例数据集及创建代码:

A <- c("hi", "bye", "hi", "hi", "bye")
B <- c(1, 2, 1, 9, 4)
C <- c(2, 5, 6, 1, 4)

HiBye.df <- data.frame(A, B, C)

数据集内容:

A B C
1  hi 1 2
2 bye 2 5
3  hi 1 6
4  hi 9 1
5 bye 4 4

手动计算单个分组(A="hi")均值的代码可行:

HiMeans <- subset(HiBye.df, A == "hi")
HiMeans <- colMeans(HiMeans[, c(2:3)], na.rm = TRUE)

结果:

B        C 
3.666667 3.000000 

但自定义函数处理多分组时出错:

means <- function (x){
  subsetx <- subset(HiBye.df, A == "x")
  meanx <- colMeans(subsetx[ ,c(2:3)])
  meanx
}

# 调用返回NaN
means(hi)

返回结果:

B    C 
NaN NaN 

错误原因

  1. 函数中A == "x"是匹配字符串"x",而非传入的参数x,导致无法筛选目标分组;
  2. 调用means(hi)时,hi未加引号,R会将其视为未定义变量而非字符串。

解决方案

方案1:修正自定义函数

修改函数内的匹配逻辑,直接使用参数x,调用时传入字符串:

means <- function(x){
  subsetx <- subset(HiBye.df, A == x)
  meanx <- colMeans(subsetx[, c(2:3)], na.rm = TRUE)
  meanx
}

# 正确调用
means("hi")
means("bye")

方案2:使用内置aggregate函数(推荐,无需自定义函数)

自动处理所有分组,直接输出各分组的均值:

aggregate(cbind(B, C) ~ A, data = HiBye.df, FUN = mean, na.rm = TRUE)

输出结果:

A        B        C
1 bye 3.000000 4.500000
2  hi 3.666667 3.000000

方案3:使用dplyr包(适合复杂数据处理场景)

语法更直观,支持链式操作:

library(dplyr)

HiBye.df %>%
  group_by(A) %>%
  summarise(across(c(B, C), mean, na.rm = TRUE))

输出结果与aggregate一致。

内容的提问来源于stack exchange,提问作者katy123456

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:02:57