Функция для установки NA в конкретном столбце кадра данных в 0 в R
Я пытаюсь написать функцию для замены значений NA во втором столбце фрейма данных на 0. Я знаю, если "х" мой фрейм данных, то
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 ответа
Решение
Я думаю, что вы делаете это сложнее, чем нужно. Код, который вы имеете в первом чанке, вполне подойдет как функция:
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)
Вы можете упростить функцию:
SetNaToZero <- function(x) {
x[is.na(x[[2]]), 2] <- 0
x
}
Упростите это далее:
SetNaToZero <- function(x)
"[<-"(x, is.na(x[[2]]), 2, 0)