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
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? –
@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. –
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' –