在R语言中基于条件列名创建数据框新列
解决方案
以下是几种在R中实现需求的方法,适用于不同场景:
基础R方法
无需额外包,直接用内置函数处理:
# 生成目标列 data$Column_D <- apply(data[, -which(names(data) == "Reference")], 1, function(row) { # 提取当前行值为TRUE的列名,并用逗号拼接 paste(names(row)[row], collapse = ", ") })
解释:data[, -which(names(data) == "Reference")]筛选出除Reference外的列,apply(..., 1)按行遍历,每行中筛选出值为TRUE的列名,再用paste拼接成字符串。
tidyverse 方法
适合习惯tidy语法的用户,需加载dplyr包:
library(dplyr) data <- data %>% rowwise() %>% # 遍历除Reference外的所有列,筛选值为TRUE的列名并拼接 mutate(Column_D = paste(names(pick(-Reference))[c_across(-Reference)], collapse = ", ")) %>% ungroup()
如果是超大型数据集,rowwise效率较低,可改用purrr的批量处理:
library(dplyr) library(purrr) data <- data %>% mutate(Column_D = pmap_chr(pick(-Reference), ~{ row_vals <- c(...) paste(names(row_vals)[row_vals], collapse = ", ") }))
data.table 方法
针对大型数据集优化,效率更高,需加载data.table包:
library(data.table) # 将data.frame转为data.table setDT(data) # 按Reference分组(逐行处理),生成目标列 data[, Column_D := { row_cols <- .SD paste(names(row_cols)[row_cols], collapse = ", ") }, by = Reference, .SDcols = -"Reference"]
执行上述任意方法后,查看data即可得到预期结果。
内容的提问来源于stack exchange,提问作者Rolotoni
相关产品推荐
相关产品推荐

