如何用R tidyverse处理长格式患者数据的种族字段不一致问题?
处理患者种族字段不一致的R tidyverse方案
原始数据
# 创建数据框 df <- data.frame( patient_id = c(1, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 6), dob = c("6/16/1926", "6/16/1926", "6/16/1926", "12/6/1935", "12/6/1935", "5/18/1938", "5/18/1938", "7/18/1944", "2/3/1949", "2/3/1949", "11/27/1960", "11/27/1960", "11/27/1960"), sex = c("Female", "Female", "Female", "Female", "Female", "Male", "Male", "Male", "Female", "Female", "Male", "Male", "Male"), race = c("Black or African American", NA, "White", NA, "White", "Asian", "White", "White", "Other", "White", NA, "White", "White") ) # 显示数据框 print(df)
处理规则
- 同一患者有2条及以上记录且包含NA时:将NA替换为该患者第一个非NA种族值(若存在多种非NA种族则优先标记为混合种族)
- 同一患者有2条及以上非NA且不同的种族记录时:将该患者所有记录的
race字段替换为"Mixed Race"
问题分析
你之前的代码存在两个核心问题:
- 替换NA的逻辑未先判断是否存在多种非NA种族,直接用
first(na.omit(race))覆盖,导致后续判断不同种族时出错 - 用
n_distinct(race)判断时,未排除NA的干扰,且处理顺序错误(应先判断混合种族,再处理NA)
正确实现代码
library(tidyverse) df_cleaned <- df %>% group_by(patient_id) %>% mutate( # 提取当前患者所有非NA的唯一种族值 unique_races = list(unique(na.omit(race))), # 按规则更新race字段 race = case_when( # 存在多种非NA种族时标记为混合种族 length(unique_races[[1]]) > 1 ~ "Mixed Race", # 仅有一种非NA种族时,替换所有NA为该值 length(unique_races[[1]]) == 1 ~ unique_races[[1]], # 全为NA时保持原值 TRUE ~ race ) ) %>% select(-unique_races) %>% # 删除辅助列 ungroup() # 查看处理后结果 print(df_cleaned)
处理结果说明
- patient_id=1、3、5:存在两种不同非NA种族,所有记录的
race变为"Mixed Race" - patient_id=2、6:仅有一种非NA种族,NA被替换为该种族值("White")
- patient_id=4:仅一条非NA记录,保持原
race值不变 - 全NA的患者(若存在):
race保持NA
内容的提问来源于stack exchange,提问作者wisamb
相关产品推荐
相关产品推荐

