使用R中的data.table将所有数字列中的NAs替换为0
我想编写代码,使用data.table语法在所有数字列中将NAs替换为0 我的代码如下:使用R中的data.table将所有数字列中的NAs替换为0,r,if-statement,data.table,lapply,na,R,If Statement,Data.table,Lapply,Na,我想编写代码,使用data.table语法在所有数字列中将NAs替换为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:
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
你能告诉我为什么我的代码不工作,我应该怎么做来纠正它吗
您的建议将不胜感激。我们可以通过在所需的数字列上循环来使用set,并将i中指定的NA元素设置为0
关于OP的代码,当有多个元素时,我们使用ifelse或replace,并且输出应分配回感兴趣的列,否则,我们将只更新.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)
num_cols <- sapply(dt, is.numeric)
dt2 <- dt[,num_cols,with=F]
dt <- cbind(dt[,!num_cols, with=F],dt2)