我有一个data.table,其中包含不同数据类型的列。我的目标是仅选择数字列,并将这些列中的NA值替换为0。
我知道用零替换na值是这样的:

DT[is.na(DT)] <- 0

为了只选择数字列,我找到了这种解决方案,它可以很好地工作:
DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]

我可以通过分配来实现我想要的
DT2 <- DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]

然后执行:
DT2[is.na(DT2)] <- 0

但是,我当然希望通过引用修改我的原始DT。但是,具有以下内容:
DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE]
                 [is.na(DT[, as.numeric(which(sapply(DT,is.numeric))), with = FALSE])]<- 0

我懂了



我想念什么?
任何帮助深表感谢!!

最佳答案

我们可以使用set

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

或为数字列创建索引,循环遍历,然后将NA值set设置为0
ind <-   which(sapply(DT, is.numeric))
for(j in ind){
    set(DT, i = which(is.na(DT[[j]])), j = j, value = 0)
}

数据
set.seed(24)
DT <- data.table(v1= c(NA, 1:4), v2 = c(NA, LETTERS[1:4]), v3=c(rnorm(4), NA))

关于仅在data.table的数字列中将NA替换为0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37391573/

10-11 15:05