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

如何将数据框中除ID外的多列数值转换为二进制(0编码为1)

高效实现R数据框非ID列的二进制转换

先看你的原始数据:

ID<-c("A1", "A2", "A3", "A4", "A5")  
x<-c(0,1,2,1,1)
y<-c(2,1,1,1,1)
z<-c(0,1,1,0,0)
mydata<-data.frame(ID,x,y,z)

需求是:除ID列外,所有列将值为0的元素转为1,其余值转为0,且数据量有约1000列,需要高效实现。

以下是几个高效方案,按性能和易用性排序:

方案1:基础R矩阵操作(最快,适合大列数)

利用矢量化运算直接处理,完全避免逐列循环,处理1000列速度极快:

# 对除ID外的所有列批量转换
mydata[-1] <- as.integer(mydata[-1] == 0)

原理:mydata[-1] == 0生成布尔矩阵(TRUE对应原0值,FALSE对应其他值),as.integer()将TRUE转1、FALSE转0,直接赋值回原数据框的非ID列。

方案2:dplyr管道式操作(简洁易读)

如果你习惯tidyverse语法,dplyr的across()做了性能优化,处理大列数效率优异:

library(dplyr)

mydata <- mydata %>%
  mutate(across(-ID, ~ as.integer(.x == 0)))

across(-ID)指定对除ID外的所有列操作,~ as.integer(.x == 0)为每列应用转换规则。

方案3:data.table操作(适合超大规模数据集)

如果数据行数也极大,data.table的就地修改特性能大幅降低内存占用:

library(data.table)

setDT(mydata)
mydata[, (setdiff(names(mydata), "ID")) := lapply(.SD, function(x) as.integer(x == 0)), .SDcols = -"ID"]

setDT()将数据框转为data.table,.SDcols = -"ID"指定处理列,lapply(.SD, ...)批量转换后就地赋值。

验证转换结果

执行任意方案后,查看结果:

print(mydata)

输出如下:

ID x y z
1  A1 1 0 1
2  A2 0 0 0
3  A3 0 0 0
4  A4 0 0 1
5  A5 0 0 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 07:42:24