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
我正在寻找一个可持续的解决方案,因为原始数据集有几百万行。
编辑:
我找到了一个解决方案,但它非常难看,而且速度肯定太慢,因为通过 22009 x 86 的数据帧需要将近 10 秒。有没有人有更好的解决方案?
编码:
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
推荐阅读
- javascript - 为什么 ![] 和 [] == false 会产生不同的结果?
- angular - 在事件绑定中使用函数作为变量的概念是什么?
- swift - 当我为 UIPageViewController 设置 transitionStyle: .scroll 并从另一张幻灯片返回时,旧数据被拉出
- java - 重复键值
- android - 我无法更改公共变量 Kotlin
- go - Seaweedfs 删除文件成功,但现有文件管理器仍保留它
- java - 使用连接提取休眠巨大的内存分配
- rest - 将现有用户添加到现有组 apache ranger
- python-3.x - QueueTrigger 写入 Queue-Python
- postgresql - Postgresql 13 LOG:无法重命名文件“pg_wal/0000000100000001000000C6”