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

求助:如何改写R函数实现自动分组计算均值标准差并代入公式

解决方案

你可以重写函数,让它接收age和group两个向量,在函数内部自动分组计算均值和标准差,再代入公式。这里提供两种实现方式:

方式一:Base R 实现(无需额外包)

# 重写后的函数
formula <- function(age, group) {
  # 检查分组是否仅包含两组
  if (length(unique(group)) != 2) {
    stop("group 参数必须只包含两组数据")
  }
  
  # 按分组计算年龄的均值和标准差
  group_stats <- tapply(age, group, function(x) c(mean = mean(x), sd = sd(x)))
  
  # 提取组1和组2的统计量
  group1_mean <- group_stats[[1]]["mean"]
  group2_mean <- group_stats[[2]]["mean"]
  group1_sd <- group_stats[[1]]["sd"]
  group2_sd <- group_stats[[2]]["sd"]
  
  # 代入公式计算
  (group1_mean - group2_mean) / sqrt((group1_sd^2 + group2_sd^2) / 2)
}

调用方式:

# 使用你的数据集测试
df <- structure(list(group = c(1, 1, 1, 2, 2, 2, 2), age = c(45, 67, 
43, 23, 78, 87, 12)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -7L))

formula(df$age, df$group)

方式二:dplyr 实现(适合熟悉 tidyverse 的用户)

如果你习惯用 tidyverse 工具链,可以用 dplyr 分组统计:

library(dplyr)

formula <- function(age, group) {
  # 构建临时数据框并分组计算统计量
  stats_df <- tibble(age = age, group = group) %>%
    group_by(group) %>%
    summarise(
      mean_age = mean(age),
      sd_age = sd(age),
      .groups = "drop"
    )
  
  # 检查分组数量
  if (nrow(stats_df) != 2) {
    stop("group 参数必须只包含两组数据")
  }
  
  # 提取对应组的统计值
  x <- stats_df$mean_age[stats_df$group == 1]
  y <- stats_df$mean_age[stats_df$group == 2]
  z <- stats_df$sd_age[stats_df$group == 1]
  t_val <- stats_df$sd_age[stats_df$group == 2]
  
  # 计算结果
  (x - y) / sqrt((z^2 + t_val^2) / 2)
}

关键说明

  • 函数中加入了分组数量检查,避免传入多组/单组数据时出错;
  • 方式一中用tapply一次性计算每组的均值和标准差,简化代码;
  • 方式二中用t_val代替原参数t,避免和 R 内置的t()(转置)函数重名冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:53:09