Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R中的data.table将所有数字列中的NAs替换为0_R_If Statement_Data.table_Lapply_Na - Fatal编程技术网

使用R中的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:

我想编写代码,使用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: 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)