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

R语言如何根据其他列取值新增列拼接对应转移部位名称

R语言按多列取值规则生成数据框新列

场景说明

数据处理中需要根据数据框内不同转移位点的0/1取值,拼接阳性位点名称生成汇总列,本次使用的测试示例数据结构如下:

df <- structure(list(Metastasis_Brain = c("1", "1", "0", "1", "0", "0"), 
                     Metastasis_Liver = c("0", "0", "1", "1", "1", "0"), 
                     Metastasis_Bone = c("1", "1", "0", "1", "1", "0")), 
                class = "data.frame", 
                row.names = c("Patient_1", "Patient_2", "Patient_3", "Patient_4", "Patient_5", "Patient_6"))

取值规则

  • 行内Metastasis_Brain、Metastasis_Liver取值为1、其余位点为0时,新列赋值为"Brain, Liver"
  • 行内三个位点列取值均为1时,新列赋值为"Brain, Liver, Bone"
  • 行内所有位点列取值均为0时,新列赋值为NA
  • 其余阳性组合自动拼接对应位点名称即可

实现方案

不推荐硬写多层ifelse/case_when做判断,这类写法扩展性差,后续新增位点需要修改大量逻辑,下面提供两种通用实现:

1. 基础R实现(无需安装加载第三方包)

# 配置位点列与输出名称的对应关系,新增位点直接在这里追加即可
site_col <- c("Metastasis_Brain", "Metastasis_Liver", "Metastasis_Bone")
site_name <- c("Brain", "Liver", "Bone")

# 逐行生成新列
df$Metastasis_Site <- apply(df[site_col], 1, function(row_val){
  pos <- site_name[row_val == "1"]
  if (length(pos) == 0) return(NA_character_)
  paste(pos, collapse = ", ")
})

2. Tidyverse实现(适合日常用dplyr流水线处理数据的场景)

library(dplyr)

# 位点映射配置,新增位点直接追加
site_map <- c(
  Metastasis_Brain = "Brain",
  Metastasis_Liver = "Liver",
  Metastasis_Bone = "Bone"
)

df <- df |>
  rowwise() |>
  mutate(
    Metastasis_Site = paste(
      site_map[names(site_map)[c_across(all_of(names(site_map))) == "1"]],
      collapse = ", "
    ),
    Metastasis_Site = ifelse(Metastasis_Site == "", NA_character_, Metastasis_Site)
  ) |>
  ungroup()

运行结果

两种写法输出结果一致,最终数据框如下:

Metastasis_Brain Metastasis_Liver Metastasis_Bone   Metastasis_Site
Patient_1                1                0                1       Brain, Bone
Patient_2                1                0                1       Brain, Bone
Patient_3                0                1                0             Liver
Patient_4                1                1                1 Brain, Liver, Bone
Patient_5                0                1                1       Liver, Bone
Patient_6                0                0                0              <NA>

如果存在Metastasis_Brain=1, Metastasis_Liver=1, Metastasis_Bone=0的行,会自动输出Brain, Liver,完全符合规则要求。

内容的提问来源于stack exchange,提问作者PythonNoob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:36:20