用户编写的函数,用于将NA替换为0,因为循环在r中不工作

用户编写的函数,用于将NA替换为0,因为循环在r中不工作,r,function,for-loop,if-statement,data.table,R,Function,For Loop,If Statement,Data.table,[数据表] 我编写了这样一个函数,如果列是数值的,则将NA替换为0 fn.naremove <- function(data){ for (i in 1: length(data)){ if (class(data[[i]]) %in% c("numeric", "interger", "interger64")) { print(data[, names(data[, i]) := replace(data[, i], i

[数据表] 我编写了这样一个函数,如果列是数值的,则将NA替换为0

fn.naremove <- function(data){ 
for (i in 1: length(data)){
if (class(data[[i]]) %in% c("numeric", "interger", "interger64")) {
  print(data[, names(data[, i]) := replace(data[, i], is.na(data[, i]), 0)])
} 
else {
 print(data)
}}}
如果我使用实际列索引运行代码,它将平稳运行,并返回我想要的列编号1的结果:

dt1[, names(dt1[, 1]) := replace(dt1[, 1], is.na(dt1[, 1]), 0)]

  C1 C2 C3
1:  1  9  9
2:  5 NA  7
3: 14 NA 42
4:  0  3 87
5: 54 42 NA
请告诉我,如果我错过或做错了我的功能。
提前谢谢

您可以使用
替换

replace(dt1, is.na(dt1), 0)
#    C1 C2 C3
# 1:  1  9  9
# 2:  5  0  7
# 3: 14  0 42
# 4:  0  3 87
# 5: 54 42  0
data.table
universe中有一个很好的循环,我们可以将其扩展到特定的类

dt1 <- cbind(dt1, x=c("a", NA))  ## add a categorcal variable

library(data.table)
classes <- c("numeric", "interger", "interger64")  ## define sp. classes

fun <- function(DT) {
  for (j in names(DT)) {
    set(DT, which(is.na(DT[[j]]) & class(DT[[j]]) %in% classes), j, 0)
  }
}

fun(dt1)
dt1
#    C1 C2 C3    x
# 1:  1  9  9    a
# 2:  5  0  7 <NA>
# 3: 14  0 42    a
# 4:  0  3 87 <NA>
# 5: 54 42  0    a
dt1请注意,
名称(dt1[,1])
可以工作,但当您这样做时-

i <- 1
names(dt1[, i])

谢谢你的回答!也许我必须回到手动过滤分类列的方式,这样会更容易@1darknight查看更新哪些是所需的类选择的原因。为什么要在函数中打印?我在stackoverflow中搜索了一下,了解到如果希望内部代码正常工作,需要将print()放在函数中。因为您将在R控制台中看到结果打印输出。
dt1 <- cbind(dt1, x=c("a", NA))  ## add a categorcal variable

library(data.table)
classes <- c("numeric", "interger", "interger64")  ## define sp. classes

fun <- function(DT) {
  for (j in names(DT)) {
    set(DT, which(is.na(DT[[j]]) & class(DT[[j]]) %in% classes), j, 0)
  }
}

fun(dt1)
dt1
#    C1 C2 C3    x
# 1:  1  9  9    a
# 2:  5  0  7 <NA>
# 3: 14  0 42    a
# 4:  0  3 87 <NA>
# 5: 54 42  0    a
i <- 1
names(dt1[, i])
fn.naremove <- function(data){ 
  for (i in 1: length(data)){
    if (class(data[[i]]) %in% c("numeric", "interger", "interger64")) {
      print(data[, names(data)[i] := replace(data[[i]], is.na(data[[i]]), 0)])
    } else {
      print(data)
    }}
}
fn.naremove(dt1)