如何将R数据框多列合并为一列?附需求示例
解决方案:为R数据框新增拼接TRUE列名的列
针对你这个需求,我给你两种实用的解法,不管你习惯用基础R还是tidyverse工具包都能搞定:
方法一:基础R实现(无需额外安装包)
这种方法用apply()函数逐行处理数据,逻辑清晰直接:
# 给df新增color列 df$color <- apply(df[, -which(names(df) == "name")], 1, function(row) { # 筛选当前行中值为TRUE的列名 true_cols <- names(row)[row] # 如果没有TRUE的列就返回空字符串,否则用逗号拼接 if (length(true_cols) == 0) "" else paste(true_cols, collapse = ",") })
解释一下:
df[, -which(names(df) == "name")]:排除name列,只保留所有TRUE/FALSE的颜色列apply(..., 1):按行处理每一行数据- 匿名函数里先提取当前行中值为TRUE的列名,再判断是否为空,最后拼接成字符串
方法二:tidyverse工具包实现(更符合现代R语法)
如果你平时常用dplyr这类工具,用rowwise()结合c_across()的写法更流畅:
library(dplyr) df <- df %>% rowwise() %>% # 选中除name外的所有列,筛选值为TRUE的列名并拼接 mutate(color = paste(names(select(cur_data(), -name))[c_across(-name)], collapse = ",")) %>% ungroup()
或者用purrr::pmap_chr()的写法,同样简洁:
library(dplyr) library(purrr) df <- df %>% mutate(color = pmap_chr(select(., -name), ~ { row_vals <- c(...) paste(names(row_vals)[row_vals], collapse = ",") }))
两种方法运行后,你都会得到想要的结果:
> df name red green blue color 1 ball TRUE TRUE TRUE red,green,blue 2 pen FALSE TRUE TRUE green,blue 3 box FALSE FALSE FALSE
内容的提问来源于stack exchange,提问作者TheMP
相关产品推荐
相关产品推荐

