2012-05-14 11 views
14

ich einige R-Code haben, die auf alle Dateien in dem aktuellen Verzeichnis eine Datenextraktionsvorgang durchführt, mit dem folgenden Code:Ausgänge von lapply zu einem Datenrahmen Extrahierung

files <- list.files(".", pattern="*.tts") 
results <- lapply(files, data_for_time, "17/06/2006 12:00:00") 

Die Ausgabe von lapply ist die folgende (extrahiert mit dput()) - im Grunde eine Liste voller Vektoren:

list(c("amer", "14.5"), c("appl", "14.2"), c("brec", "13.1"), 
c("camb", "13.5"), c("camo", "30.1"), c("cari", "13.8"), 
c("chio", "21.1"), c("dung", "9.4"), c("east", "11.8"), c("exmo", 
"12.1"), c("farb", "14.7"), c("hard", "15.6"), c("herm", 
"24.3"), c("hero", "13.3"), c("hert", "11.8"), c("hung", 
"26"), c("lizr", "14"), c("maid", "30.4"), c("mart", "8.8" 
), c("newb", "14.7"), c("newl", "14.3"), c("oxfr", "13.9" 
), c("padt", "10.3"), c("pbil", "13.6"), c("pmtg", "11.1" 
), c("pmth", "11.7"), c("pool", "14.6"), c("prae", "11.9" 
), c("ral2", "12.2"), c("sano", "15.3"), c("scil", "36.2" 
), c("sham", "12.9"), c("stra", "30.9"), c("stro", "14.7" 
), c("taut", "13.7"), c("tedd", "22.3"), c("wari", "12.7" 
), c("weiw", "13.6"), c("weyb", "8.4")) 

Allerdings würde Ich mag, um dann mit diesem Ausgang als Datenrahmen mit zwei Spalten beschäftigen: ein für den alphabetischen Code ("amer", "appl" usw.) und eine für t er Nummer (14.5, 14.2 usw.).

Leider as.data.frame scheint nicht mit dieser Eingabe von verschachtelten Vektoren innerhalb einer Liste zu arbeiten. Wie soll ich das umsetzen? Muss ich ändern, wie meine Funktion data_for_time ihre Werte zurückgibt? Im Moment gibt es einfach c(name, value) zurück. Oder gibt es eine gute Möglichkeit, von dieser Art von Ausgabe in einen Datenrahmen zu konvertieren?

+1

Wenn Sie verwendet hatten 'sapply' statt' lapply' Sie ein „normales“ Objekt bekommen haben könnten. –

Antwort

8

Eine Option könnte die ldply Funktion aus dem plyr Paket sein, die Dinge wieder in einen Datenrahmen für Sie näht.

Ein triviales Beispiel für seine Verwendung:

ldply(1:10,.fun = function(x){c(runif(1),"a")}) 
        V1 V2 
1 0.406373084755614 a 
2 0.456838687881827 a 
3 0.681300171650946 a 
4 0.294320539338514 a 
5 0.811559669673443 a 
6 0.340881009353325 a 
7 0.134072444401681 a 
8 0.00850683846510947 a 
9 0.326008745934814 a 
10 0.90791508089751 a 

Aber beachten Sie, dass, wenn Sie Variablentypen mit c() abmischen, werden Sie wahrscheinlich wird Ihre Funktion ändern wollen zurückzukehren einfach data.frame(name= name,value = value) statt c(name,value). Sonst wird alles zum Charakter gezwungen (wie in meinem obigen Beispiel).

28

diese versuchen, wenn results Ihre Liste waren:

> as.data.frame(do.call(rbind, results)) 

    V1 V2 
1 amer 14.5 
2 appl 14.2 
3 brec 13.1 
4 camb 13.5 
... 
+4

+1 - 'do.call' ist elegant hier. Ich würde sogar empfehlen, dass das OP seine "data_for_time" -Funktion ändert, um ein data.frame mit passenden Namen und Typen zurückzugeben. Um den Aufruf "as.data.frame" hier und das Risiko von Nötigung zu entfernen. – flodel

1

Wegen und forNelton nahm die Antwort, die ich im Begriff war zu geben und Joran nahm die einzige andere vernünftige Antwort, die ich denken konnte, und da soll ich zu schreiben ein Papier hier ist eine lächerliche Antwort:

#I named your list LIST 
LIST2 <- LIST[[1]] 
lapply(2:length(LIST), function(i) {LIST2 <<- rbind(LIST2, LIST[[i]])}) 
data.frame(LIST2) 
3
inp <- list(c("amer", "14.5"), c("appl", "14.2"), .... # did not see need to copy all 

data.frame(first= sapply(inp, "[", 1), 
      second =as.numeric(sapply(inp, "[", 2))) 

    first second 
1 amer 14.5 
2 appl 14.2 
3 brec 13.1 
4 camb 13.5 
5 camo 30.1 
6 cari 13.8 
snipped output 
Verwandte Themen