将NA替换为0,仅在data.table中的数字列中

Han*_*esZ 6 r numeric na data.table

我有一个data.table与不同数据类型的列.我的目标是只选择数字列,并将这些列中的NA值替换为0.我知道用零替换na值如下所示:

DT[is.na(DT)] <- 0
Run Code Online (Sandbox Code Playgroud)

要仅选择数字列,我找到了这个解决方案,它工作正常:

DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]
Run Code Online (Sandbox Code Playgroud)

我可以通过分配实现我想要的

DT2 <- DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]
Run Code Online (Sandbox Code Playgroud)

然后做:

DT2[is.na(DT2)] <- 0
Run Code Online (Sandbox Code Playgroud)

但是我当然希望通过引用修改我原来的DT.但是,以下内容:

DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]
                 [is.na(DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE])]<- 0
Run Code Online (Sandbox Code Playgroud)

我明白了

" [.data.table([...] i中的错误是无效类型(矩阵)"

我错过了什么?任何帮助深表感谢!!

akr*_*run 11

我们可以用 set

for(j in seq_along(DT)){
    set(DT, i = which(is.na(DT[[j]]) & is.numeric(DT[[j]])), j = j, value = 0)
 }
Run Code Online (Sandbox Code Playgroud)

或者为数字列创建索引,循环遍历它并将setNA值设置为0

ind <-   which(sapply(DT, is.numeric))
for(j in ind){
    set(DT, i = which(is.na(DT[[j]])), j = j, value = 0)
}
Run Code Online (Sandbox Code Playgroud)

数据

set.seed(24)
DT <- data.table(v1= c(NA, 1:4), v2 = c(NA, LETTERS[1:4]), v3=c(rnorm(4), NA))
Run Code Online (Sandbox Code Playgroud)