我正在尝试编写一个函数来将数据帧第二列中的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
我感谢任何建议。
答案 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)