R语言:编写函数处理嵌套数据集,计算全组合疾病率
R语言实现全分组组合的疾病指标计算
核心思路
我们可以通过分位数分组+批量分组统计的方式,快速覆盖所有gender、status、身高分位、体重分位的组合,计算对应的疾病指标并合并成一个数据集。下面提供两种实用实现方式:
方法一:用dplyr快速实现(推荐)
利用tidyverse的分组统计功能,无需手动循环,代码简洁高效。
步骤1:准备数据(含示例数据生成)
先给身高、体重划分四分位,方便后续分组:
# 加载所需包 library(dplyr) # 生成示例数据集(可替换为你的真实数据) set.seed(123) patient_data <- tibble( Patient_ID = 1:1000, gender = sample(c("男", "女"), 1000, replace = TRUE), status = sample(c("移民", "本地"), 1000, replace = TRUE), height = rnorm(1000, 170, 10), weight = rnorm(1000, 70, 8), disease = sample(c(0, 1), 1000, replace = TRUE, prob = c(0.7, 0.3)) ) # 为身高、体重添加四分位分组(1=最低25%,4=最高25%) patient_data <- patient_data %>% mutate( height_quartile = ntile(height, 4), weight_quartile = ntile(weight, 4) )
步骤2:全组合统计指标
直接按所有维度分组,计算所需指标:
# 计算所有分组组合的疾病统计指标 full_stats <- patient_data %>% group_by(gender, status, height_quartile, weight_quartile) %>% summarise( total_patients = n(), # 分组总人数 disease_count = sum(disease), # 患病数 disease_rate = disease_count / total_patients, # 疾病率 .groups = "drop" # 计算完成后取消分组结构 ) # 查看结果示例 head(full_stats)
方法二:函数+循环实现(灵活自定义)
如果需要更复杂的自定义逻辑,可以用函数封装统计逻辑,再遍历所有可能的分组组合。
步骤1:生成所有分组组合
# 生成gender、status、身高分位、体重分位的所有可能组合 all_combinations <- expand.grid( gender = unique(patient_data$gender), status = unique(patient_data$status), height_quartile = 1:4, weight_quartile = 1:4 )
步骤2:定义统计函数
# 定义单个分组的统计函数 get_group_stats <- function(gender_val, status_val, h_q, w_q, data) { # 筛选对应分组的数据 group_data <- data %>% filter(gender == gender_val, status == status_val, height_quartile == h_q, weight_quartile == w_q) # 计算指标(处理空分组避免除以0) total <- nrow(group_data) disease_num <- sum(group_data$disease, na.rm = TRUE) rate <- ifelse(total == 0, NA, disease_num / total) # 返回结果行 tibble( gender = gender_val, status = status_val, height_quartile = h_q, weight_quartile = w_q, total_patients = total, disease_count = disease_num, disease_rate = rate ) }
步骤3:遍历所有组合计算
用purrr包的pmap_dfr快速遍历并合并结果:
library(purrr) full_stats_loop <- pmap_dfr(all_combinations, get_group_stats, data = patient_data) # 查看结果示例 head(full_stats_loop)
注意事项
- 若数据中存在缺失值,可在
filter或sum中添加na.rm = TRUE处理。 ntile函数会自动将数值均匀分成指定份数,若需要自定义分位数阈值(比如用固定的身高数值划分),可替换为cut函数。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

