在 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 的代码,当有多个元素时,我们使用 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)
我想编写代码,使用 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 的代码,当有多个元素时,我们使用 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)