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

如何用for循环简化R语言adsl数据集的多变量汇总代码

解决重复汇总代码的两种方法

方法一:修正你的for循环

你原来的循环有两个问题:一是每次循环都把结果覆盖到i变量里,最后只剩最后一个变量的汇总结果;二是在summarise里直接用adsl[i]的引用方式,不适用于分组后的数据集。修正后的代码如下:

# 先初始化空列表存储每个变量的汇总结果
result_list <- list()
# 循环遍历目标变量名
for (var_name in c('AGE', 'STAGEN')) {
  temp_result <- adsl %>% 
    summarise(
      param = var_name,
      mean = mean(.data[[var_name]], na.rm = TRUE),
      sd = sd(.data[[var_name]], na.rm = TRUE),
      median = quantile(.data[[var_name]], probs = 0.5, na.rm = TRUE),
      min = min(.data[[var_name]], na.rm = TRUE),
      max = max(.data[[var_name]], na.rm = TRUE)
    )
  # 将临时结果加入列表,避免覆盖
  result_list[[var_name]] <- temp_result
}
# 合并列表中所有结果
final_result <- bind_rows(result_list)

这里用.data[[var_name]]动态引用循环中的变量名,同时用列表存储每个变量的结果,最后用bind_rows合并。另外给所有统计函数加上na.rm=TRUE,避免NA值干扰计算结果。

方法二:用dplyr长表汇总(更简洁高效)

其实不需要写循环,把宽表转成长表后统一汇总,代码更简洁易读:

final_result <- adsl %>%
  # 将需要汇总的变量转成长格式,保留分组变量ACTARM
  pivot_longer(cols = c(AGE, STAGEN), names_to = "param", values_to = "value") %>%
  # 按分组变量和参数名分组
  group_by(ACTARM, param) %>%
  # 一次性计算所有统计量
  summarise(
    mean = mean(value, na.rm = TRUE),
    sd = sd(value, na.rm = TRUE),
    median = quantile(value, probs = 0.5, na.rm = TRUE),
    min = min(value, na.rm = TRUE),
    max = max(value, na.rm = TRUE),
    .groups = "drop"
  )

这种方法通过pivot_longer把多个数值变量合并成一列,再统一计算统计量,省去了手动循环的繁琐,也减少出错概率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:20:06