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

如何将多变量的均值与置信区间上下限合并至单个单元格

问题

需要批量处理100+个变量(50组pre/post),按group分组后计算修剪均值(注:原代码中trim=4不符合mean()函数参数要求,该参数应为0-0.5的比例,建议检查修正)和95%置信区间,并将均值、置信区间下限、上限合并到同一单元格,避免手动整理。

原计算代码:

library(gmodels)
library(purrr)
dfci <- df %>% 
  group_by(group) %>% 
  dplyr::summarize(across(everything(),
  .fns = list(mean = ~ mean(.x, na.rm = TRUE, trim = 4),
  ci = ~ ci(.x, confidence = 0.95, alpha = 0.05, na.rm = T))))
#dfci <- dfci[-(13:16),] # remove additional rows
write.csv(dfci, file="dfci.csv")

样本数据:

Group| A_pre  |    A_post |  B_pre |  B_post 
0       20          21        20        23
1       30          10        19        11
2       10          53        30        34
1       22          32        25        20
2       34          40        32        30
0       30          50        NA        40
0       39          40        19        20
1       40          NA        20        20
2       50          10        20        10
0       34          23        30        10

尝试用reshape2转换格式但未成功:

library(reshape2)

dfci <- df %>%
  group_by(group) %>%
  summarize(across(everything(),
                   .fns = list(mean = ~ mean(.x, na.rm = TRUE, trim = 4),
                               ci = ~ ci(.x, confidence = 0.95, alpha = 0.05, na.rm = TRUE))))

dfci <- melt(dfci, id.vars = "group")
dfci <- dcast(dfci, group + variable ~ variable)

write.csv(dfci, file = "dfi.csv", row.names = FALSE)

解决方案

无需额外做格式转换,直接在summarize的across中对每个变量完成均值计算、CI提取、格式合并的一站式处理,代码如下:

library(dplyr)
library(gmodels)

# 读取样本数据(若已有数据可跳过此步)
df <- read.table(text = "Group| A_pre  |    A_post |  B_pre |  B_post 
0       20          21        20        23
1       30          10        19        11
2       10          53        30        34
1       22          32        25        20
2       34          40        32        30
0       30          50        NA        40
0       39          40        19        20
1       40          NA        20        20
2       50          10        20        10
0       34          23        30        10", sep = "|", header = TRUE, strip.white = TRUE)

# 分组计算并合并结果
dfci <- df %>%
  group_by(Group) %>%
  summarize(
    across(
      -Group,  # 排除分组变量,处理其余所有变量
      .fns = ~ {
        # 计算修剪均值(修正trim参数为合理比例,示例用trim=0.1)
        m <- mean(.x, na.rm = TRUE, trim = 0.1)
        # 提取95%置信区间的上下限
        ci_result <- ci(.x, confidence = 0.95, na.rm = TRUE)
        # 合并为指定格式,可按需调整小数位数或分隔符
        sprintf("%.2f (%.2f-%.2f)", m, ci_result[1], ci_result[2])
      },
      .names = "{.col}"  # 保留原变量名
    )
  )

# 输出合并后的结果
write.csv(dfci, file = "dfci_merged.csv", row.names = FALSE)

关键说明

  1. 一站式处理:在across的匿名函数中直接完成均值计算、CI提取、字符串合并,避免后续格式转换的繁琐操作;
  2. CI提取逻辑:gmodels::ci()返回长度为2的向量,第一个元素是置信区间下限,第二个是上限,直接索引提取即可;
  3. 格式自定义:通过sprintf可灵活调整输出格式,比如修改小数位数、替换分隔符或括号样式;
  4. trim参数修正:mean()的trim参数要求为0-0.5的比例(表示修剪首尾数据的比例),原代码的trim=4会触发错误,建议替换为合理值(如trim=0.1)。

内容的提问来源于stack exchange,提问作者amir.fathi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:17:42