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
相关产品推荐
相关产品推荐

