我想将默认值(255(更改为NA。
dt <- data.table(x = c(1,5,255,0,NA), y = c(1,7,255,0,0), z = c(4,2,7,8,255))
coords <- c('x', 'y')
它给出了以下代码:
x y z
1: 1 1 4
2: 5 7 2
3: 255 255 7
4: 0 0 8
5: NA 0 255
我想到的最远的是:
dt[.SD == 255, (.SD) := NA, .SDcols = coords]
请注意,z列保持不变。所以只有指定的列,而不是所有列。
但这并不能帮助我获得解决方案:
x y z
1: 1 1 4
2: 5 7 2
3: NA NA 7
4: 0 0 8
5: NA 0 255
我正在寻找一个可持续的解决方案,因为原始数据集有几百万行。
编辑:
我找到了一个解决方案,但它很难看,而且速度太慢了,因为它需要将近10秒才能通过22009 x 86的数据帧。有人有更好的解决方案吗?
代码:
dt[, replace(.SD, .SD == 255, NA), .SDcols = coords, by = c(colnames(dt)[!colnames(dt) %in% coords])]
以下是如何将列保持在.SDcols
、之外
library(data.table)
dt[, (coords) := replace(.SD, .SD == 255, NA), .SDcols = coords]
它给出
x y z 1: 1 1 4 2: 5 7 2 3: NA NA 7 4: 0 0 8 5: NA 0 255
您也可以执行以下操作:
require(data.table)
dt[ ,
(coords) := lapply(.SD, function(x) fifelse(x == 255, NA_real_, x)),
.SDcols = coords ]
将它与索托斯的答案进行比较后,它似乎也快了一点。