Подтвердить что ты не робот

Заменить значения NA из столбца с 0 в кадре данных R

Возможный дубликат:
Установите NA в 0 в R

У меня есть data.frame с столбцом, имеющим значения NA. Я хочу заменить NA на 0 или любое другое значение. Я пробовал много потоков и методов, но это не дало мне результата. Я пробовал следующие методы.

a$x[a$x==NA]<-0;
a[,c("x")]<-apply(a[,c("x")],1,function(z){replace(z, is.na(z), 0)});
a$x[is.na(a$x),]<-0;

Ни один из вышеперечисленных методов не заменил NA на 0 в столбце x для data.frame a. Почему?

4b9b3361

Ответ 1

Поскольку никто до сих пор не счел нужным указать, почему то, что вы пытаетесь, не работает:

  • NA == NA не возвращает TRUE, он возвращает NA (поскольку по сравнению с undefined значения должны давать результат undefined).
  • Вы пытаетесь вызвать apply на атомном векторе. Вы не можете использовать apply для циклического перемещения элементов в столбце.
  • Ваши индексы отключены - вы пытаетесь дать два индекса в a$x, который является только столбцом (атомным вектором).

Я исправлю 3., чтобы добраться до a$x[is.na(a$x)] <- 0

Ответ 2

Во-первых, здесь приведены некоторые данные:

set.seed(1)
dat <- data.frame(one = rnorm(15),
                 two = sample(LETTERS, 15),
                 three = rnorm(15),
                 four = runif(15))
dat <- data.frame(lapply(dat, function(x) { x[sample(15, 5)] <- NA; x }))
head(dat)
#          one  two       three      four
# 1         NA    M  0.80418951 0.8921983
# 2  0.1836433    O -0.05710677        NA
# 3 -0.8356286    L  0.50360797 0.3899895
# 4         NA    E          NA        NA
# 5  0.3295078    S          NA 0.9606180
# 6 -0.8204684 <NA> -1.28459935 0.4346595

Здесь наша замена:

dat[["four"]][is.na(dat[["four"]])] <- 0
head(dat)
#          one  two       three      four
# 1         NA    M  0.80418951 0.8921983
# 2  0.1836433    O -0.05710677 0.0000000
# 3 -0.8356286    L  0.50360797 0.3899895
# 4         NA    E          NA 0.0000000
# 5  0.3295078    S          NA 0.9606180
# 6 -0.8204684 <NA> -1.28459935 0.4346595

В качестве альтернативы вы можете, конечно, написать dat$four[is.na(dat$four)] <- 0