如何基于列标题汇总检测状态,生成包含对应列名的新列?
问题描述
我有如下R数据框:
ID<- c(1,2,3,4,5) CV<- c("Detected", "Not Detected", "Detected", "Not Detected", "Detected") RV<- c("Not Detected", "Detected", "Not Detected", "Detected", "Not Detected") BP<- c("Detected", "Detected", "Not Detected", "Detected", "Detected") FL<- c("Detected", "Detected", "Not Detected", "Detected", "Detected") df<- data.frame(ID, CV, RV, BP, FL)
希望为每行创建一个新列Result,将该行中值为Detected的列名用逗号拼接起来,最终效果如下:
| ID | CV | RV | BP | FL | Result |
|---|---|---|---|---|---|
| 1 | Detected | Not Detected | Detected | Detected | CV, BP, FL |
| 2 | Not Detected | Detected | Detected | Detected | RV, BP, FL |
| 3 | Detected | Not Detected | Not Detected | Not Detected | CV |
| 4 | Not Detected | Detected | Detected | Detected | RV, BP, FL |
| 5 | Detected | Not Detected | Detected | Detected | CV, BP, FL |
解决方案
以下是几种实现方式:
方法1:基础R实现
无需额外安装包,使用apply逐行处理:
df$Result <- apply(df[, -1], 1, function(x) { paste(names(x)[x == "Detected"], collapse = ", ") })
方法2:tidyverse风格实现
使用dplyr的行处理功能:
library(dplyr) df <- df %>% rowwise() %>% mutate(Result = paste(names(.)[-1][c_across(-ID) == "Detected"], collapse = ", ")) %>% ungroup()
方法3:data.table高效实现
适合处理大规模数据集:
library(data.table) setDT(df) df[, Result := apply(.SD, 1, function(x) paste(names(x)[x == "Detected"], collapse = ", ")), .SDcols = -"ID"]
内容的提问来源于stack exchange,提问作者T.McMillen
相关产品推荐
相关产品推荐

