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

如何高效替换data.frame多列中的1为列名并合并列?

问题与解决方案

给定如下R语言的data.frame对象df:

df <- data.frame(
  Typ1 = c(1, 0, 1),
  Typ2 = c(0, 1, 0)
)

需要实现两个目标:一是将每列中值为1的元素替换为对应列名(替代原有的逐列赋值写法),二是最终合并为单列Typ。


一、更简洁的列值替换方法

方法1:使用dplyr批量处理

借助dplyr的across函数可以一次性处理所有列,无需逐列编写赋值语句:

library(dplyr)

df_processed <- df %>%
  mutate(across(everything(), ~ifelse(.x == 1, cur_column(), .x)))

across(everything())遍历所有列,cur_column()自动获取当前列的列名,通过ifelse完成替换逻辑。

方法2:基础R原生实现

不用第三方包的话,用mapply可以批量配对列和列名进行处理:

df_processed <- as.data.frame(mapply(function(col, col_name) {
  col[col == 1] <- col_name
  col
}, df, names(df)))

二、合并为单列Typ

方案1:基于处理后的数据集合并

不管用上面哪种方法处理完列后,都可以通过max.col定位每行的目标列名:

# dplyr风格
df_final <- df_processed %>%
  mutate(Typ = names(.)[max.col(., ties.method = "first")]) %>%
  select(Typ)

# 基础R风格
df_final <- data.frame(
  Typ = names(df_processed)[max.col(df_processed, ties.method = "first")]
)

方案2:一步到位直接生成结果

因为原数据每行仅存在一个1,完全可以跳过替换步骤,直接定位1所在列并提取列名:

df_final <- data.frame(
  Typ = names(df)[max.col(df, ties.method = "first")]
)

这是最简洁的实现方式,直接得到目标单列:

Typ
1 Typ1
2 Typ2
3 Typ1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:20:33