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

如何用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"

问题分析

你之前的代码存在两个核心问题:

  1. 替换NA的逻辑未先判断是否存在多种非NA种族,直接用first(na.omit(race))覆盖,导致后续判断不同种族时出错
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 14:40:54