2012-05-14 63 views
14

我有,其對在當前目錄中的所有文件的某些數據提取操作的一些R代碼裏面,使用以下代碼:提取從lapply輸出到數據幀

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

從lapply的輸出是下面的(提取的使用dput()) - 基本上是一個完整的向量列表:

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")) 

不過,我想,然後處理這個輸出作爲一個數據幀有兩個列:一個用於字母代碼("amer""appl"等)和一個用於Ť他編號(14.5,14.2等)。

不幸的是,as.data.frame似乎不適用於列表中嵌套向量的輸入。我應該如何轉換這個?我是否需要改變我的功能data_for_time返回其值的方式?目前它只返回c(name, value)。或者是否有從這種輸出轉換爲數據框的好方法?

+1

如果您用過'sapply',而不是'lapply'你可能已經獲得了更多的「常規」的對象。 –

回答

8

一個選項可能是使用來自plyr包的ldply函數,該函數包將爲您重新組合一個數據框。

它的一個簡單的例子是使用:

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 

但要注意的是,如果你是混合變量類型與c(),你可能會希望改變你的函數返回的只是data.frame(name= name,value = value)代替c(name,value)。否則一切都會被強制轉換爲字符(就像我在上面的例子中那樣)。

28

試試這個,如果results是你的清單:

> 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'在這裏很優雅。我甚至會建議操作系統修改他的'data_for_time'函數來返回一個data.frame和適當的名字和類型。以便在此刪除'as.data.frame'調用和強制的風險。 – flodel

1

因爲和forNelton了我是在給予的過程中響應和Joran把我能想到的唯一其他合理的反應,因爲我認爲在這裏寫文章是一個荒謬的答案:

#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