Функция для установки 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)
Другие вопросы по тегам