如何用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
相关产品推荐
相关产品推荐

