2017-05-22 1 views
0

Ich habe es mit einer sehr großen Liste von großen Datenrahmen (~ 2 GB). Um Platz zu sparen und die Dateigröße zu reduzieren, möchte ich einige Elemente der Liste entfernen, die alle NA sind. Als Teil der Operation muss ich gather und dann in einem einzigen data.frame binden.Entfernen Sie Elemente der Liste basierend auf Bedingung während "Schleife"

Hier ist ein Beispiel:

library(tidyr) 
library(dplyr) 

a <- data.frame(x=rep(1,3), y1=1:3, y2=1:3) 
b <- data.frame(x=rep(2,3), y1=NA, y2=NA) 
c <- data.frame(x=rep(3,3), y1=1:3, y2=NA) 

l <- list(a,b,c) 

t <- lapply(l, function(x){ 
    gather(x, key="type", value="value", -x) # %>% 
    #remove list element here %>% 
    #do other operations like mutate here 
}) %>% 
    bind_rows 

Das Ergebnis dieser enthält einige data.frames, die alle NA für meine Werte von y sind.

Ich möchte Elemente aus der Liste vollständig entfernen. Wenn alle Zeilen mit NA entfernt werden, bleibt mir immer noch ein leeres Listenelement, das dann weitere Berechnungen mit mutate oder anderen Operationen stürzt.

Ich versuche, diese Operation mit dem ersten Anruf zu lapply zu kümmern, weil ich finde, dass die Filterung danach eine Menge Speicher erfordert (oft stürzt nach Maxing die 16GB habe ich auf diesem Computer). Im Titel, wenn ich "Liste" sage, beziehe ich mich auf diese apply Aussage.

In diesem Beispiel wird das Ergebnis aussehen soll:

> t[-(7:12),] 
    x type value 
1 1 y1  1 
2 1 y1  2 
3 1 y1  3 
4 1 y2  1 
5 1 y2  2 
6 1 y2  3 
13 3 y1  1 
14 3 y1  2 
15 3 y1  3 
16 3 y2 NA 
17 3 y2 NA 
18 3 y2 NA 

Antwort

1

Also, ich bin nicht 100% sicher, dass ich die Frage verstanden, aber unter der Annahme, ich tat, würde eine mögliche Antwort sein:

t <- lapply(l, function(x){ 
      gather(x, key="type", value="value", -x) %>%  
        subset(!sum(!is.na(value)) == 0) }) 
     %>% bind_rows 
t 
    x type value 
1 1 y1  1 
2 1 y1  2 
3 1 y1  3 
4 1 y2  1 
5 1 y2  2 
6 1 y2  3 
7 3 y1  1 
8 3 y1  2 
9 3 y1  3 
10 3 y2 NA 
11 3 y2 NA 
12 3 y2 NA 
+0

Ich versuche zu vermeiden, separate Variable zu erstellen, dh so viel wie ich mit Rohren tun kann. Wenn ich separate Variablen erzeuge, habe ich keinen Speicher mehr. Kann ich die "subset" -Anweisung in die "lapply" -Anweisung bringen und Pipes verwenden? –

+0

@LloydChristmas mit dem Beispiel, das Sie zur Verfügung gestellt haben, können Sie! Im Allgemeinen sehe ich nicht, warum Sie nicht würden, da die Ausgabe von "subset" eine Liste selbst ist. –

+0

Danke. Das scheint zu funktionieren. Obwohl es zu einer verschachtelten 'lapply'-Anweisung führt. Ich werde das auf meinem größeren Datensatz testen und sehen, ob es rechnerisch realisierbar ist. Überarbeiteter Code: 'lapply (l, funktion (x) { sammeln (x, schlüssel =" typ ", wert =" wert ", -x)%>% teilmenge (unlist (lapply (l, funktion (x)! all (is.na (x [, - 1])))))})%>% bind_rows' –

Verwandte Themen