2017-02-05 26 views
14

Ich möchte NA Werte mit Nullen über mutate_if in dplyr ersetzen. Die Syntax unten:Korrekte Syntax für 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)) 

kehrt Fehler:

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

Was ist die korrekte Syntax für diesen Vorgang?

Antwort

6

lernte ich diesen Trick aus dem purrr tutorial, und es funktioniert auch in dplyr. Es gibt zwei Möglichkeiten, dieses Problem zu lösen:
Zuerst benutzerdefinierte Funktionen außerhalb des Rohres definieren, und verwenden Sie es in 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) 

Zweitens verwenden die Kombination aus ~, . oder .x (.x kann sein ersetzt mit ., aber keine anderen Zeichen oder 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,.)) 

In Ihrem Fall können Sie auch mutate_all() verwenden:

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

Mit ~, können wir eine anonyme Funktion, während .x oder . steht für die Variable definieren. In mutate_if() Fall, . oder .x ist jede Spalte.

21

Das "if" in mutate_if bezieht sich auf Spalten, nicht Zeilen. ZB mutate_if(data, is.numeric, ...) bedeutet, eine Transformation für alle numerischen Spalten in Ihrem Dataset durchzuführen.

Wenn Sie alle NAs mit Nullen in numerischen Spalten ersetzt werden soll:

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

funktioniert gut, man könnte stattdessen "if_else" verwenden, um im "tidyverse" zu bleiben und für die zusätzliche Prüfung der Kohärenz vom Typ TRUE, FALSE zu profitieren – aurelien

2

Wir verwenden set von 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) 
} 
Verwandte Themen