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

按组计算均值标准误差遇NA结果问题求助

问题原因与解决方案

问题原因

你遇到的标准误差返回NA的核心问题是summarise步骤中的列名覆盖导致变量引用错误:

  • 在summarise中,你先定义了depression = mean(depression),这会用分组后的单个均值覆盖原始的depression列。后续计算se.dep = std.error(depression)时,这里的depression已经是每组的单个数值,而标准差sd()需要至少两个数据点才能计算,因此返回NA。
  • 同理anxiety列也是如此:先将其替换为分组均值,后续sd(anxiety)实际是对单个数值计算标准差,结果必然为NA。

解决方案

方案1:避免列名覆盖,给均值列重命名

给均值列设置与原始列不同的名称,确保后续计算标准误差时能正常引用原始数据列:

data("AddHealth", package = "heplots")
library(dplyr)

std.error <- function(x, na.rm = TRUE) {
  sd(x, na.rm = na.rm) / sqrt(length(x))
}

AddHealth |>
  group_by(grade) |>
  summarise(
    mean_depression = mean(depression),
    mean_anxiety = mean(anxiety),
    n = n(),
    se.dep = std.error(depression),
    se.anx = sd(anxiety, na.rm = TRUE) / sqrt(n)
  ) |> 
  print()

方案2:用.data代词明确引用原始列

如果不想修改列名,可通过.data代词指定使用原始数据中的列,避免被新生成的均值列覆盖:

AddHealth |>
  group_by(grade) |>
  summarise(
    depression = mean(depression),
    anxiety = mean(anxiety),
    n = n(),
    se.dep = std.error(.data$depression),
    se.anx = sd(.data$anxiety, na.rm = TRUE) / sqrt(n)
  ) |> 
  print()

方案3:用across批量计算(更简洁)

如果需要处理多个变量,across可以高效地同时计算均值和标准误差,自动避免列名冲突:

AddHealth |>
  group_by(grade) |>
  summarise(
    across(c(depression, anxiety), list(mean = mean, se = ~sd(., na.rm=TRUE)/sqrt(n()))),
    n = n()
  ) |>
  print()

该方式会生成depression_mean、depression_se、anxiety_mean、anxiety_se等列,结构更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:14:00