如何用R语言按组在多列中搜索并生成恶性标记变量
问题描述
现有癌症患者检测数据,每位患者有1-4次检测记录,部分记录包含细胞学(cytology)结果,部分包含病理学(pathology)结果,部分两项都有。原始数据如下:
library(dplyr) library(tibble) data<-tribble( ~record_number, ~tool, ~cytology, ~pathology, 114, "forceps", "Indeterminate", NA, 114, "needle", "Non-Malignant", "Malignant", 114, "lavage", NA, "Indeterminate", 115, "forceps", NA, "Non-Malignant", 115, "needle", NA, "Malignant" )
需要新增一个Malignant变量(取值0/1):按record_number分组后,若同一患者的任意一条记录中,cytology或pathology列出现"Malignant",则该患者所有记录的Malignant值为1,否则为0。期望输出如下:
desired<-tribble( ~record_number, ~tool, ~cytology, ~pathology, ~Malignant, 114, "forceps", "Indeterminate", NA, 1, 114, "needle", "Non-Malignant", "Malignant", 1, 114, "lavage", NA, "Indeterminate", 1, 115, "forceps", NA, "Non-Malignant", 1, 115, "needle", NA, "Malignant", 1, )
已想到用group_by(record_number)开头,但不清楚后续步骤,求解决思路。
解决方法
核心思路是按患者分组后,检查组内是否存在任意一条记录满足cytology == "Malignant"或pathology == "Malignant",再将这个判断结果映射到组内所有记录。
具体代码实现如下:
data_with_malignant <- data %>% group_by(record_number) %>% mutate( # 检查组内是否有任意记录的cytology或pathology为"Malignant" Malignant = as.integer(any(cytology == "Malignant" | pathology == "Malignant", na.rm = TRUE)) ) %>% ungroup() # 取消分组,恢复普通数据框格式
代码解释
group_by(record_number):按患者ID分组,确保后续操作基于同一患者的所有记录。any(cytology == "Malignant" | pathology == "Malignant", na.rm = TRUE):cytology == "Malignant" | pathology == "Malignant":逐行判断当前记录是否满足细胞学或病理学结果为恶性。any(..., na.rm = TRUE):检查组内是否存在至少一条满足上述条件的记录,na.rm = TRUE用于忽略NA值,避免NA干扰判断结果。
as.integer():将逻辑值(TRUE/FALSE)转换为0/1的整数格式,符合需求的变量取值。ungroup():操作完成后取消分组,避免后续操作受分组状态影响。
运行上述代码后,得到的data_with_malignant就和期望的desired数据一致。
内容的提问来源于stack exchange,提问作者John Ryan
相关产品推荐
相关产品推荐

