Как заменить значения NA нулями в кадре данных R? - PullRequest
619 голосов
/ 17 ноября 2011

У меня есть фрейм данных, а в некоторых столбцах значения NA.

Как заменить эти NA значения нулями?

Ответы [ 17 ]

7 голосов
/ 20 мая 2016

Прокомментировал бы пост @ ianmunoz, но мне не хватает репутации. Вы можете комбинировать dplyr mutate_each и replace для замены NA на 0. Использование фрейма данных из ответа @ aL3xa ...

> m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
> d <- as.data.frame(m)
> d

    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  8  1  9  6  9 NA  8  9   8
2   8  3  6  8  2  1 NA NA  6   3
3   6  6  3 NA  2 NA NA  5  7   7
4  10  6  1  1  7  9  1 10  3  10
5  10  6  7 10 10  3  2  5  4   6
6   2  4  1  5  7 NA NA  8  4   4
7   7  2  3  1  4 10 NA  8  7   7
8   9  5  8 10  5  3  5  8  3   2
9   9  1  8  7  6  5 NA NA  6   7
10  6 10  8  7  1  1  2  2  5   7

> d %>% mutate_each( funs_( interp( ~replace(., is.na(.),0) ) ) )

    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  8  1  9  6  9  0  8  9   8
2   8  3  6  8  2  1  0  0  6   3
3   6  6  3  0  2  0  0  5  7   7
4  10  6  1  1  7  9  1 10  3  10
5  10  6  7 10 10  3  2  5  4   6
6   2  4  1  5  7  0  0  8  4   4
7   7  2  3  1  4 10  0  8  7   7
8   9  5  8 10  5  3  5  8  3   2
9   9  1  8  7  6  5  0  0  6   7
10  6 10  8  7  1  1  2  2  5   7

Мы используем стандартную оценку (SE), поэтому нам нужно подчеркнуть «funs_». Мы также используем lazyeval interp / ~, а . ссылается на «все, с чем мы работаем», то есть на фрейм данных. Теперь есть нули!

7 голосов
/ 14 января 2019

Также можно использовать tidyr::replace_na.

    library(tidyr)
    df <- df %>% mutate_all(funs(replace_na(.,0)))
4 голосов
/ 30 марта 2013

Вы можете использовать replace()

Например:

> x <- c(-1,0,1,0,NA,0,1,1)
> x1 <- replace(x,5,1)
> x1
[1] -1  0  1  0  1  0  1  1

> x1 <- replace(x,5,mean(x,na.rm=T))
> x1
[1] -1.00  0.00  1.00  0.00  0.29  0.00 1.00  1.00
4 голосов
/ 10 октября 2016

Другой dplyr совместимый с конвейером параметр с tidyr методом replace_na, который работает для нескольких столбцов:

require(dplyr)
require(tidyr)

m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
d <- as.data.frame(m)

myList <- setNames(lapply(vector("list", ncol(d)), function(x) x <- 0), names(d))

df <- d %>% replace_na(myList)

Вы можете легко ограничиться, например, числовыми столбцами:

d$str <- c("string", NA)

myList <- myList[sapply(d, is.numeric)]

df <- d %>% replace_na(myList)
3 голосов
/ 03 февраля 2019

Специальная функция (nafill / setnafill) для этой цели недавно появилась в data.table версии

install.packages("data.table", repos="https://Rdatatable.gitlab.io/data.table")
library(data.table)
ans_df = nafill(df, fill=0)
setnafill(df, fill=0) # this one updates in-place
3 голосов
/ 11 апреля 2017

Эта простая функция, извлеченная из Datacamp , может помочь:

replace_missings <- function(x, replacement) {
  is_miss <- is.na(x)
  x[is_miss] <- replacement

  message(sum(is_miss), " missings replaced by the value ", replacement)
  x
}

Тогда

replace_missings(df, replacement = 0)
0 голосов
/ 11 июня 2019

Простой способ написать это с помощью if_na из hablar:

library(dplyr)
library(hablar)

df <- tibble(a = c(1, 2, 3, NA, 5, 6, 8))

df %>% 
  mutate(a = if_na(a, 0))

, который возвращает:

      a
  <dbl>
1     1
2     2
3     3
4     0
5     5
6     6
7     8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...