2013-08-16 109 views
3

我試圖將一列13,000個元素,每個元素都是nr = 230和ncol = 4的zoo對象轉換爲數據框。將大列表轉換爲data.frame

我試過setattr(mylist, 'class', 'data.frame'),但它導致了一個巨大的NA向量。 我也嘗試了plyr軟件包中的quickdf(mylist)函數,但那也不起作用。

do.call(rbind.data.frame, mylist)類型的方法非常慢,因此在這種情況下不是一個選項。

有關將此列表轉換爲數據框的最有效方法的任何建議?

+0

請不要在標題中添加冗餘標籤名稱。 –

+0

哪個標籤是多餘的? – Mayou

+0

[tag:R]標籤(在標題中)。 –

回答

8

使用rbindlist。

data <- matrix(data = 1, nrow = 230, ncol = 4) 
lstData <- rep(list(data), 16000) 

library(data.table) 
lstData <- Map(as.data.frame, lstData) 
dfrData <- rbindlist(lstData) 


system.time(dfrData <- rbindlist(lstData)) 
user system elapsed 
0.12 0.03 0.15 
+0

它很好用!結果是'data.table',然後我簡單地將它轉換爲data.frame!謝謝!! – Mayou

+2

1.對於時間序列,我會使用xts。它基本上是動物園,但速度優化。 2.你可以爲日期本身做一個rbindlist。 lstIndex < - Map(as.data.frame,Map(index,lstData)) dfrIndex < - rbindlist(lstIndex) setnames(dfrIndex,「Date」) lstData < - Map(as.data.frame,lstData ) dfrData < - rbindlist(lstData) zooResult < - as.zoo(dfrData,as.Date(dfrIndex $ Date))' –

+1

您已解決我的問題。非常感謝!我會提高你的回答,我只是沒有足夠的聲譽:) – Mayou

0

我不知道這是否是有效的,但你可以從data.table嘗試軟件包

library(plyr) 
ldply(mylist) 
+0

正如我在問題中指定的那樣,'docall.rbind(mylist)'不是一個選項,因爲從內存管理的角度來看它是無效的,並且運行時間很長。我沒有嘗試'ldply(mylist)'雖然..會嘗試,謝謝! – Mayou

+0

我已經刪除了那個。 – Metrics

+1

謝謝!我目前正在嘗試'ldply(mylist)',它非常慢。我會讓它運行並報告運行時間,如果它不是過度的。但是我相信在這種情況下肯定有更高效的方法.. – Mayou