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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:27:10