2017-06-26 2 views
-1

Kurz von einem replace_na_if Verb, was ist der beste Weg, um systematisch NAs in allen Zeichen/numerischen/logischen/etc ... Spalten mit dem gleichen Wert zu ersetzen? Hier ist was ich jetzt mache.beste Art zu hacken replace_na_if in R

VOR

starwars %>% 
    # islolate the columns for the post 
    select_if(is.numeric) %>% 
    filter(!complete.cases(.)) 

# A tibble: 51 x 3 
    height mass birth_year 
    <int> <dbl>  <dbl> 
1  97 32   NA 
2 180 NA   64 
3 180 110   NA 
4 150 NA   48 
5  NA NA   NA 
6 160 68   NA 
7 191 90   NA 
8 170 NA   91 
9 224 82   NA 
10 206 NA   NA 
# ... with 41 more rows 

NACH

starwars %>% 
    # isolate the columns for the post 
    select_if(is.numeric) %>% 
    filter(!complete.cases(.)) %>% 
    replace_na(as.list(
    setNames(rep(0, sum(map_chr(., class) == "numeric")), 
      colnames(.)[map_chr(., class) == "numeric"]))) 

# A tibble: 51 x 3 
    height mass birth_year 
    <int> <dbl>  <dbl> 
1  97 32   0 
2 180  0   64 
3 180 110   0 
4 150  0   48 
5  NA  0   0 
6 160 68   0 
7 191 90   0 
8 170  0   91 
9 224 82   0 
10 206  0   0 
# ... with 41 more rows 

Antwort

1

können Sie kombinieren mutate_if und ifelse dies zu erreichen:

library(dplyr) 
starwars %>% mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .))) 

können Sie verwenden auch tidyr :: replace_na auch, aber Sie‘ d muss jedoch eine Liste von Spalten und deren gefüllten Werten bereitstellen:

library(tidyr) 
replace_ls <- starwars %>% 
    select_if(is.numeric) %>% names() %>% 
    sapply(function(x) 0, USE.NAMES=TRUE) %>% 
    as.list() 

replace_na(starwars, replace_ls) 
+0

ja, guter Punkt. sollte die mutate_if-Idee als Option veröffentlichen. Übrigens solltest du 'purrr' ausprobieren! würde auch lieber für die ganze Operation in der Leitung bleiben. – ericgtaylor

+0

'mutate_if (is.numeric, funs (replace (., Is.na (.), 0))) 'funktioniert auch. Ich denke, dass diese Lösung oder Ihr "ausreichend" sauber sind. – ericgtaylor

0

Da is.na eine data.frame Methode hat, es ist so einfach wie

starwars[is.na(starwars)] <- 0 
+0

richtig, versuchen nicht das Rohr zu brechen. dies löst auch nicht den selektiven Ersatz für die Spaltenklasse. – ericgtaylor

+0

Spalten auswählen ist eindeutig ein gelöstes Problem von Ihrem Beitrag. Dies in eine Pipe zu integrieren, ist eine Übung für den Leser. –

+0

Sie haben Recht, dass ich eine funktionierende Lösung habe. Ich suchte nach etwas eleganterem, das das Rohr nicht brechen muss. die Lösung von LMW. war ein guter. Ihre Lösung ist etwas, was ich häufig tue, aber nicht den selektiven Ersatz für die Spaltenklasse. edler Schritt auf dem Downvote. – ericgtaylor

Verwandte Themen