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

如何在R中将data.table指定多列的非零值替换为1

将data.table物种列的非零值替换为1

嘿,这个需求用data.table的原生高效语法就能轻松搞定,咱们一步步来:

首先先确认你的原始数据:

library(data.table)
Well <- c("A1", "A2", "A3", "A4", "A5")
Episyrphus <- c(0,0,5,3,1)
Eupeodes <- c(2,0,4,1,0)
Syrphus <- c(0,4,0,3,2)
dt <- data.table(Well, Episyrphus, Eupeodes, Syrphus)
dt

输出结果:

Well Episyrphus Eupeodes Syrphus
1:   A1          0        2       0
2:   A2          0        0       4
3:   A3          5        4       0
4:   A4          3        1       3
5:   A5          1        0       2

解决方案1:手动指定目标列

直接用data.table的原地赋值语法,把指定物种列的非零值转成1:

# 针对指定的三个物种列修改
dt[, c("Episyrphus", "Eupeodes", "Syrphus") := lapply(.SD, function(x) as.integer(x != 0))]
dt

解决方案2:自动匹配目标列(更灵活)

如果后续物种列可能增加,不想手动列名的话,可以自动筛选除Well外的所有列:

# 先获取所有物种列名
species_cols <- setdiff(names(dt), "Well")
# 批量修改目标列
dt[, (species_cols) := lapply(.SD, function(x) as.integer(x != 0)), .SDcols = species_cols]
dt

最终你会得到目标数据表:

Well Episyrphus Eupeodes Syrphus
1:   A1          0        1       0
2:   A2          0        0       1
3:   A3          1        1       0
4:   A4          1        1       1
5:   A5          1        0       1

代码小解释

  • lapply(.SD, function(x) as.integer(x != 0)):遍历目标列子集,判断每个值是否非零,布尔值转整数后(TRUE变1,FALSE变0)返回
  • :=是data.table的原地赋值运算符,效率极高,不会复制整个数据表
  • .SDcols用来精准指定要操作的列,避免无关列参与计算

内容的提问来源于stack exchange,提问作者D.Hodgkiss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:39:29