如何在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
相关产品推荐
相关产品推荐

