在 R 中使用 data.table 将所有数字列中的 NA 替换为 0

Replace NAs with 0 in all numeric columns using data.table in R

我想编写代码,使用 data.table 语法将所有数字列中的 NA 替换为 0。

我的代码如下:

dt <- data.table(a = c(1:3,NA, NA, NA, 10:12 ), b = c(NA, NA, NA, 20:25), c = c(letters[1 : 7], NA, NA) )

> dt
    a  b  c
1:  1 NA  a
2:  2 NA  b
3:  3 NA  c
4: NA 20  d
5: NA 21  e
6: NA 22  f
7: 10 23  g
8: 11 24 NA
9: 12 25 NA


needed_names <- names(dt)[sapply(dt, is.numeric)]

dt_ <- dt[, lapply(.SD, function(x){if(is.na(x)) 0 else x}), .SDcols = needed_names] 

> dt_
    a b
1:  1 0
2:  2 0
3:  3 0
4: NA 0
5: NA 0
6: NA 0
7: 10 0
8: 11 0
9: 12 0

你能告诉我为什么我的代码不起作用以及我应该如何纠正它?

我们将不胜感激您的建议。

我们可以通过遍历数字列 (needed_names) 和 set i 中指定的 NA 元素到 0

for(j in needed_names){
   set(dt, i = which(is.na(dt[[j]])), j=j, value = 0)
}
dt
#    a  b  c
#1:  1  0  a
#2:  2  0  b
#3:  3  0  c
#4:  0 20  d
#5:  0 21  e
#6:  0 22  f
#7: 10 23  g
#8: 11 24 NA
#9: 12 25 NA

关于 OP 的代码,当有多个元素时,我们使用 ifelsereplace 并且输出应该分配回感兴趣的列,否则,我们只会.SDcols 中指定的列将不会在原始数据集中更新

dt[, (needed_names) := lapply(.SD, function(x) 
          replace(x, is.na(x), 0)), .SDcols = needed_names] 

或者:

num_cols <- sapply(dt, is.numeric)
dt2 <- dt[,num_cols,with=F]
dt <- cbind(dt[,!num_cols, with=F],dt2)