使用data.table在单个条件下替换多列

时间:2018-11-13 13:44:42

标签: r data.table

我想将默认值(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])]

2 个答案:

答案 0 :(得分:4)

这是将列保留在.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

答案 1 :(得分:0)

你也可以这样做:

require(data.table)
dt[ ,
    (coords) := lapply(.SD, function(x) fifelse(x == 255, NA_real_, x)),
    .SDcols = coords ]

将其与 Sotos 的答案进行比较,它似乎也快了一点。