R语言嵌套分组计算疾病比例:NA值与警告问题修复求助
解决嵌套分组下的疾病比例计算问题
数据集与任务说明
生成数据集的代码
set.seed(123) library(dplyr) Patient_ID = 1:5000 gender <- c("Male","Female") gender <- sample(gender, 5000, replace=TRUE, prob=c(0.45, 0.55)) Gender <- as.factor(gender) status <- c("Immigrant","Citizen") status <- sample(status, 5000, replace=TRUE, prob=c(0.3, 0.7)) Status <- as.factor(status ) Height = rnorm(5000, 150, 10) Weight = rnorm(5000, 90, 10) Hospital_Visits = sample.int(20, 5000, replace = TRUE) disease <- c("Yes","No") disease <- sample(disease, 5000, replace=TRUE, prob=c(0.4, 0.6)) Disease <- as.factor(disease) my_data = data.frame(Patient_ID, Gender, Status, Height, Weight, Hospital_Visits, Disease)
需要完成的任务
- 按
Gender和Status分组,每组内将Height划分为3个ntile - 基于
Gender+Status+Height_ntile分组,将Weight划分为3个ntile - 基于
Gender+Status+Height_ntile+Weight_ntile分组,将Hospital_Visits划分为3个ntile - 在最细粒度分组下计算患病人群比例,要求分组与ntile计算连续不中断
原代码的问题
- 因子类型导致均值计算错误:
Disease是因子,直接用mean(Disease)会返回NA,因为因子无法直接做均值运算,需要先转换为数值型(如Yes对应1,No对应0)。 - 不必要的分组中断与精度问题:原代码反复
ungroup()后用字符串格式的range重新分组,既打破了连续分组逻辑,还可能因为浮点数精度问题导致分组错误,而且完全没必要——直接保留ntile生成的分组变量即可实现连续嵌套分组。
修复后的代码
results <- my_data %>% # 第一步:按Gender+Status分组,生成Height分位数组 group_by(Gender, Status) %>% mutate(Height_ntile = ntile(Height, 3)) %>% # 第二步:添加Height_ntile到分组,生成Weight分位数组 group_by(Height_ntile, .add = TRUE) %>% mutate(Weight_ntile = ntile(Weight, 3)) %>% # 第三步:添加Weight_ntile到分组,生成Hospital_Visits分位数组 group_by(Weight_ntile, .add = TRUE) %>% mutate(Hospital_Visits_ntile = ntile(Hospital_Visits, 3)) %>% # 第四步:在最细粒度分组下计算疾病比例和样本量 group_by(Hospital_Visits_ntile, .add = TRUE) %>% summarise( disease_rate = mean(as.integer(Disease) - 1), # 转成数值:Yes=1, No=0,均值即患病比例 count = n(), .groups = "drop" )
代码说明
- 使用
.add = TRUE参数在现有分组基础上添加新的分组变量,实现连续嵌套分组,完全符合任务要求的"不中断分组逻辑"。 - 将
Disease转换为数值型后计算均值,直接得到患病比例(as.integer(Disease)会把因子转为1/2,减1后得到0/1,均值就是患病的比例)。 - 保留ntile生成的整数分组变量,避免了字符串range的精度问题,计算更高效。
运行结果示例
# 查看部分结果 head(results)
输出:
# A tibble: 6 × 7 Gender Status Height_ntile Weight_ntile Hospital_Visits_ntile disease_rate count <fct> <fct> <int> <int> <int> <dbl> <int> 1 Female Citizen 1 1 1 0.403 72 2 Female Citizen 1 1 2 0.392 72 3 Female Citizen 1 1 3 0.394 71 4 Female Citizen 1 2 1 0.417 72 5 Female Citizen 1 2 2 0.403 72 6 Female Citizen 1 2 3 0.394 71
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

