用于将数据帧的特定列中的NA设置为R中的0

时间:2014-12-17 16:04:34

标签: r function na

我正在尝试编写一个函数来将数据帧第二列中的NA值替换为0.我知道“x”是否是我的数据框

x[,2][is.na(x[,2]) <- 0 

将完成这项工作。但是,我想为此编写一个函数,以便我可以应用于不同的数据帧。我想出了

SetNaToZero <- function(x) {
x <-data.frame(x)
x[1:nrow(x),2][is.na(x[1:nrow(x),2])] <-0
return(x)
}

但是当我在数据框上应用它时会返回以下错误:

Error in `[<-.data.frame`(`*tmp*`, 1:nrow(x), 2, value = numeric(0)) : 
replacement has length zero 

我感谢任何建议。

2 个答案:

答案 0 :(得分:2)

我认为你比你需要的更难。您在第一个块中的代码可以很好地作为函数:

SetNaToZero <- function(x) {
  x[,2][is.na(x[, 2])] <- 0
  return(x)
}

行动中:

set.seed(123)
dat <- data.frame(a=rnorm(10),
                  b=sample(c(NA, 1:3), 10, replace=T))

SetNaToZero(dat)
             a b
1  -0.56047565 3
2  -0.23017749 2
3   1.55870831 2
4   0.07050839 3
5   0.12928774 2
6   1.71506499 2
7   0.46091621 2
8  -1.26506123 2
9  -0.68685285 1
10 -0.44566197 0

如果您想修改对象,可以随时执行dat <- SetNaToZero(dat)

答案 1 :(得分:0)

您可以简化功能:

SetNaToZero <- function(x) {
  x[is.na(x[[2]]), 2] <- 0
  x
}

进一步简化:

SetNaToZero <- function(x)
  "[<-"(x, is.na(x[[2]]), 2, 0)