如何将自定义函数应用于同一DataFrame中的多个变量?
批量处理多变量并整合统计结果
修改原函数(添加变量标识与统一结构)
首先调整原函数,让它能为每个变量的统计结果添加标识,同时统一整体人群和分性别人群的输出结构:
library(tidyverse) library(survey) fun <- function(data, var_1) { # 获取变量的字符串名称 var_name <- as_label(enquo(var_1)) # 整体人群的统计结果,添加Sex="All"标记 prop_all <- data %>% filter({{var_1}} >= 0) %>% group_by({{var_1}}) %>% summarise( Percent = round(survey_mean(vartype = "ci") * 100, 0), Total = unweighted(n()) ) %>% mutate( Sex = "All", Variable = var_name ) # 分性别的统计结果,添加变量名标识 prop_sex <- data %>% filter({{var_1}} >= 0 & Sex >= 0) %>% group_by(Sex, {{var_1}}) %>% summarise( Percent = round(survey_mean(vartype = "ci") * 100, 0), Total = unweighted(n()) ) %>% mutate(Variable = var_name) # 合并两类结果 bind_rows(prop_all, prop_sex) }
批量应用函数并整合结果
使用purrr::map_dfr遍历目标变量列表,自动将所有结果合并为一个DataFrame:
方式1:指定变量列表
# 定义需要处理的变量名 target_vars <- c("alc", "smoke", "exercise") # 替换成你的实际变量名 # 批量处理并合并 final_stats <- map_dfr(target_vars, ~fun(df, !!sym(.x)))
方式2:自动筛选变量
如果需要批量处理某类变量(比如所有数值型变量,排除Sex):
# 自动筛选目标变量 target_vars <- df %>% select(where(is.numeric), -Sex) %>% colnames() # 批量处理 final_stats <- map_dfr(target_vars, ~fun(df, !!sym(.x)))
关键修改说明
- 添加
Variable列:标记每行结果对应的原始变量,方便后续区分不同指标。 - 统一
Sex列:为整体人群的结果添加Sex="All",保证两类结果结构一致,避免绑定出错。 - 使用
{{var_1}}:替代原有的!!enquo(var_1),是tidyverse更简洁的整洁评估语法,提升代码可读性。 map_dfr:直接将多个函数输出的DataFrame按行绑定,无需手动处理列表。
内容的提问来源于stack exchange,提问作者user24831703
相关产品推荐
相关产品推荐

