首页 > 解决方案 > ifelse 的快速替代方法,用于替换 data.table 中的字符串

问题描述

我有一个大的 data.tables 列表(总共约 10m 行),其中包含许多 NA 的字符串变体,例如“N/A”或“Unknown”。对于我的所有 data.tables 中的所有列,我想用缺失值替换这些观察结果。

数据的简化示例如下:

library(data.table)
dt1 <- data.table(v1 = 1:4, v2 = c("yes", "no", "unknown", NA))
dt2 <- data.table(v1 = c("1", "2", "not applicable", "4"), v2 = c("yes", "yes", "n/a", "no"))
master_list <- list(dt1 = dt1, dt2 = dt2)

以下解决方案有效,但需要很长时间(完整数据约 30 分钟),因此我试图找到更有效的解决方案:

unknowns <- c("n/a", "not applicable", "unknown")
na_edit <- function(x){ifelse(x %in% unknowns, NA, x)}

master_list <- lapply(master_list, function(dt) {
 dt[, lapply(.SD, na_edit)]
})

> master_list$dt1
   v1   v2
1:  1  yes
2:  2   no
3:  3 <NA>
4:  4 <NA>

我尝试了类似以下的方法,消除了对 . 的需要ifelse,但我无法跨多个列进行这项工作。

lapply(master_list, function(dt) {
  dt[v2 %in% unknowns, v2 := NA]
})

我觉得答案可能在于这个线程的回复。任何人都可以帮助我对上述问题应用类似或其他方法吗?提前谢谢了。

标签: rif-statementdata.table

解决方案


推荐阅读