Замените NA на 0 в столбце фрейма данных

Возможный дубликат:
Установите для 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. Почему?


person Kunal Batra    schedule 01.11.2012    source источник
comment
Вы хотите заменить NA на 0 во всех столбцах или только в столбце x?   -  person A5C1D2H2I1M1N2O1R2T1    schedule 01.11.2012
comment
@mrdwab: просто столбец x   -  person Kunal Batra    schedule 01.11.2012


Ответы (2)


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

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

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

person themel    schedule 01.11.2012
comment
отличное объяснение.. - person shantanu pathak; 18.04.2020

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

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

person A5C1D2H2I1M1N2O1R2T1    schedule 01.11.2012
comment
эта штука сработала. Большое спасибо. Не могли бы вы предложить, если я сделал что-то неправильно в вышеупомянутых методах, которые я пробовал. - person Kunal Batra; 01.11.2012
comment
Разве ваше «альтернативное» решение не намного лучше только из-за его простоты? Дает ли использование двух двойных скобок какие-либо преимущества? - person 3pitt; 27.10.2017
comment
@MikePalmice, конечно. Альтернативное решение будет проблематичным, если вы пытаетесь подойти к проблеме программно (например, внутри функции). - person A5C1D2H2I1M1N2O1R2T1; 27.10.2017