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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:05:17