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

如何用R将数据框中1替换为列名并聚合为单列

解决0-1数据框替换与聚合问题

我来帮你搞定这个需求!针对你给出的只有0和1的data.frame,我们需要完成两个核心操作:把每个1替换成对应列名,再将每行的有效列名聚合到新列中。下面提供两种实用方案:

方案一:使用tidyverse工具链(推荐,代码可读性高)

首先确保你已经安装了dplyr和tidyr包,如果没有的话先运行install.packages(c("dplyr", "tidyr"))。

# 构造原始数据框
df <- data.frame(
  var1 = c(0, 1, 0),
  var2 = c(1, 0, 0),
  var3 = c(0, 0, 1)
)

# 执行替换与聚合操作
library(dplyr)
library(tidyr)

df_result <- df %>%
  # 遍历所有列,将1替换为当前列名,0保持不变
  mutate(across(everything(), ~ifelse(.x == 1, cur_column(), .x))) %>%
  # 按行处理,提取每行非0的列名作为var列的值
  rowwise() %>%
  mutate(var = paste(c_across(everything())[c_across(everything()) != 0], collapse = "")) %>%
  ungroup()

# 查看结果
print(df_result)

运行后你会得到期望的输出:

var1  var2  var3   var
1     0  var2     0  var2
2  var1     0     0  var1
3     0     0  var3  var3

方案二:使用基础R(无需额外安装包)

如果你不想依赖第三方包,用基础R也能轻松实现:

# 构造原始数据框
df <- data.frame(
  var1 = c(0, 1, 0),
  var2 = c(1, 0, 0),
  var3 = c(0, 0, 1)
)

# 第一步:替换1为对应列名
df_replaced <- df
for(col_name in names(df_replaced)) {
  df_replaced[[col_name]][df_replaced[[col_name]] == 1] <- col_name
}

# 第二步:生成var列,提取每行的非0值
df_replaced$var <- apply(df_replaced, 1, function(row) row[row != 0])

# 查看结果
print(df_replaced)

这个方案的输出和上面完全一致,适合偏好基础R语法的场景。

补充说明

因为你提到每行无重复值,而原始数据每行恰好只有一个1,所以聚合的时候不需要去重逻辑。如果后续数据可能出现同一行多个1的情况,只需要在聚合时加上unique()即可,比如在tidyverse方案里把paste(...)改成paste(unique(...), collapse = ", ")就能用逗号分隔去重后的列名。

内容的提问来源于stack exchange,提问作者Balachandar Kaliappan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:38:13