如何在R中按patient_id统计符合规则的cond变量患者数量?
按患者分组统计cond类别数量的解决方案
核心思路
先按patient_id分组,提取每个患者的非NA cond值,再根据规则判断患者所属类别,最后统计各类别数量。
示例数据构造
# 模拟题目中的示例数据(patient1存在错误的0,实际应为1) df <- data.frame( patient_id = c(1, 1, 2, 3, 3, 4), cond = c(0, 1, 0, NA, 1, NA) )
代码实现(使用dplyr)
library(dplyr) # 分组判定每个患者的类别 patient_category <- df %>% group_by(patient_id) %>% summarise( # 提取当前患者所有非NA的cond值 valid_cond = na.omit(cond), # 根据规则判定类别 category = case_when( length(valid_cond) == 0 ~ "NA's", # 仅含NA any(valid_cond == 1) ~ "1's", # 存在任意1 all(valid_cond == 0) ~ "0's", # 仅含0或0+NA TRUE ~ "999" # 含其他值 ), .groups = "drop" ) # 统计各类别数量,确保4个类别都显示(即使数量为0) result <- factor(patient_category$category, levels = c("0's", "1's", "NA's", "999")) %>% table() print(result)
输出结果
运行后会得到符合要求的统计:
0's 1's NA's 999 1 2 1 0
代码说明
group_by(patient_id):按患者ID分组,确保每个患者的cond值被统一处理na.omit(cond):过滤掉NA值,只保留有效取值用于判断case_when:按优先级判定类别(先判断全NA,再判断含1的情况,因为含1的优先级高于含0)factor(..., levels = ...):强制指定4个类别,避免某个类别数量为0时不显示
内容的提问来源于stack exchange,提问作者joejoe9
相关产品推荐
相关产品推荐

