2017-02-05 13 views
14

Chciałbym zastąpić wartości NA zerami poprzez mutate_if w dplyr. Składnia poniżej błęduPoprawna składnia mutate_if

set.seed(1) 
mtcars[sample(1:dim(mtcars)[1], 5), 
     sample(1:dim(mtcars)[2], 5)] <- NA 

require(dplyr) 

mtcars %>% 
    mutate_if(is.na,0) 

mtcars %>% 
    mutate_if(is.na, funs(. = 0)) 

Powroty:

Error in vapply(tbl, p, logical(1), ...) : values must be length 1, 
but FUN(X[[1]]) result is length 32 

Jaka jest poprawna składnia dla tej operacji?

Odpowiedz

6

dowiedziałem ten trick z purrr tutorial, a także działa w dplyr. Istnieją dwa sposoby rozwiązania tego problemu:
Najpierw zdefiniuj funkcje niestandardowe zewnątrz rury i używać go w mutate_if().

any_column_NA <- function(x){ 
    any(is.na(x)) 
} 
replace_NA_0 <- function(x){ 
    if_else(is.na(x),0,x) 
} 
mtcars %>% mutate_if(any_column_NA,replace_NA_0) 

Po drugie, należy użyć kombinacji ~, . lub .x (.x może być zastąpione ., ale nie jakikolwiek inny znak lub symbol):

mtcars %>% mutate_if(~ any(is.na(.x)),~ if_else(is.na(.x),0,.x)) 
#This also works 
mtcars %>% mutate_if(~ any(is.na(.)),~ if_else(is.na(.),0,.)) 

W twoim przypadku, można również użyć mutate_all():

mtcars %>% mutate_all(~ if_else(is.na(.x),0,.x)) 

Korzystanie ~ możemy zdefiniować anonimową funkcję, natomiast .x lub . Stojaki do zmiennej. W przypadku mutate_if() w każdej kolumnie znajduje się . lub .x.

21

"Jeśli" w mutate_if odnosi się do wyboru kolumn , a nie wierszy. Np. mutate_if(data, is.numeric, ...) oznacza przeprowadzenie transformacji wszystkich kolumn numerycznych w zestawie danych.

Jeśli chcesz zastąpić wszystkie NAS zerami w kolumnach liczbowych:

data %>% mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .))) 
+2

działa dobrze, można użyć 'if_else' zamiast pozostać w' tidyverse' i korzystać z dodatkowej kontroli spójności typu TRUE, FALSE – aurelien

2

Możemy użyć set z data.table

library(data.table) 
setDT(mtcars) 
for(j in seq_along(mtcars)){ 
    set(mtcars, i= which(is.na(mtcars[[j]])), j = j, value = 0) 
} 
Powiązane problemy