Bedingt auswählen von Spalten in dplyr, wo bestimmter Anteil der Werte ist NA

Daten

Ich arbeite mit einem Datensatz, die wie die data.frame darunter generiert:

set.seed(1)
dta <- data.frame(observation = 1:20,
                  valueA = runif(n = 20),
                  valueB = runif(n = 20),
                  valueC = runif(n = 20),
                  valueD = runif(n = 20))
dta[2:5,3] <- NA
dta[2:10,4] <- NA
dta[7:20,5] <- NA

Spalten NA Werte mit der letzten Spalte mit mehr als 60% der Beobachtungen NAs.

> sapply(dta, function(x) {table(is.na(x))})
$observation

FALSE 
   20 

$valueA

FALSE 
   20 

$valueB

FALSE  TRUE 
   16     4 

$valueC

FALSE  TRUE 
   11     9 

$valueD

FALSE  TRUE 
    6    14 

Problem

Möchte ich entfernen können diese Spalte in dplyr Rohrleitung irgendwie an die select argument.

Versuche

Dies kann leicht getan werden in base. Zum Beispiel können Sie Spalten auswählen, die mit weniger als 50% NAs ich tun kann:

dta[, colSums(is.na(dta)) < nrow(dta) / 2]

produziert:

> head(dta[, colSums(is.na(dta)) < nrow(dta) / 2], 2)
  observation    valueA    valueB    valueC
1           1 0.2655087 0.9347052 0.8209463
2           2 0.3721239        NA        NA

Aufgabe

Ich bin daran interessiert, erreichen Sie die gleiche Flexibilität in dplyr pipe-line:

Vectorize(require)(package = c("dplyr",         # Data manipulation
                               "magrittr"),     # Reverse pipe

char = TRUE)

dta %<>%
  # Some transformations I'm doing on the data
  mutate_each(funs(as.numeric)) %>% 
  # I want my select to take place here
  • Sie können Filter d.h. Filter(function(x) sum(is.na(x)) < length(x)/2, dta)
  • Wie immer vielen Dank für den hilfreichen Beitrag. Ich Frage mich nur, ist das nicht der filter sein soll, fallen die Beobachtungen? Ich interessiere mich für das entfernen von Spalten, nicht Zeilen.
  • Es ist die Entfernung der Spalten, d.h. Filter mit Kapital F
  • Nun, ich bekam Sie ?Filter != ?filter 🙂
  • Noch eine Frage mit Bezug auf das vorschlagen Filter Lösung, die ich sehe, dass Sie auf der Durchreise sind die dta Objekt, auf meine real-Daten ich bin die Anwendung von Transformationen auf die Daten (wie gather und spread) so in der Tat das Objekt an dem ich arbeite, entspricht nicht der erste dta Rahmen. Dies ist der Grund, warum ich fügte hinzu, diese mutate_each(funs(as.numeric)) %>% in meinem Beispiel zu zeigen, dass ich arbeite auf einer transformierten dta. Im Effekt, ich habe nicht wirklich dta weitergeben, nur einen verwandelt data.frame nach der Anwendung ein paar Rohre.
  • Ich habe eine Lösung mit summarise_each. Vielleicht hilft es dir.

InformationsquelleAutor Konrad | 2016-01-18
Schreibe einen Kommentar