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

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计算连续不中断

原代码的问题

  1. 因子类型导致均值计算错误:Disease是因子,直接用mean(Disease)会返回NA,因为因子无法直接做均值运算,需要先转换为数值型(如Yes对应1,No对应0)。
  2. 不必要的分组中断与精度问题:原代码反复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:55:12