如何在R中忽略非数值列将数据表转为log₂(a)+1形式?
解决方法
要实现保留前两列非数值列,同时将其余数值列转换为log2(x) + 1的形式,关键是先筛选出需要计算的数值列,再执行转换,最后和前两列合并——原代码的错误在于先对整个数据表执行了对数计算(包含非数值列),直接触发报错。
正确代码(适配实际场景)
针对你前两列非数值的需求,直接修改后的代码如下:
library(data.table) logDT = DT[, c(1:2, lapply(.SD[, -c(1, 2)], function(col) log2(col) + 1))]
示例验证(对应你提供的单非数值列示例)
用你给出的测试数据表验证:
DT = data.table(x=c("b","b","b","a","a"),v=rnorm(5)) # 适配示例的代码(仅排除第1列) logDT = DT[, c(1, lapply(.SD[, -1], function(col) log2(col) + 1))]
运行后logDT会保留x列,同时将v列转换为log2(v)+1的结果(注意:若原数值列存在非正数,log2()会返回NaN,可根据数据情况提前处理,比如添加极小值log2(col + 1e-8) + 1避免报错)。
代码逻辑说明
DT[, 1:2]:提取原表的前两列非数值列.SD[, -c(1,2)]:选中原表中除前两列外的所有数值列lapply(..., function(col) log2(col)+1):对每个数值列执行log2(x)+1的转换c(...):将前两列与转换后的数值列合并为新的data.table
内容的提问来源于stack exchange,提问作者Feynman
相关产品推荐
相关产品推荐

