2012-09-04 44 views
10

是否有可能將多個數據幀存儲到一個數據結構中並在稍後由每個數據幀處理?即例如將多個數據幀存儲到一個數據結構中 - R

df1 <- data.frame(c(1,2,3), c(4,5,6)) 
df2 <- data.frame(c(11,22,33), c(44,55,66)) 

..然後我想有它們在數據結構中添加,例如我可以通過該數據結構的時間和過程它檢索的每個數據幀中的一個循環中,像

for (iterate through the data structure) # this gives df1, then df2 
{ 
    write data frame to a file 
} 

我在R中找不到任何這樣的數據結構。任何人都可以指向任何說明相同功能的代碼嗎?

回答

11

只需將data.frames放入列表中。另外一個好處是listapply樣式循環非常吻合。例如,如果您想保存data.frame的,你可以使用mapply

l = list(df1, df2) 
mapply(write.table, x = l, file = c("df1.txt", "df2.txt")) 

如果你喜歡apply風格的循環(和你,相信我:)),請看看史詩plyr包。它可能不是最快的軟件包(快速查看data.table),但它會隨着語法糖而下降。

+0

打敗我!你也可以用'lapply'來遍歷你的data.frames列表。 – Justin

+0

可能值得添加一行或兩行代碼,正如@Justin的答案所示,僅僅爲了完整性。 – joran

+0

我添加了一個如何使用'mapply'來保存data.frames使用'write.table'的例子。 –

8

列表可以用來保存幾乎所有的東西,包括data.frame S:

## Versatility of lists 
l <- list(file(), new.env(), data.frame(a=1:4)) 

對於編寫出存儲在列表中的多個數據對象,lapply()是你的朋友:

ll <- list(df1=df1, df2=df2) 
## Write out as *.csv files 
lapply(names(ll), function(X) write.csv(ll[[X]], file=paste0(X, ".csv"))) 
## Save in *.Rdata files 
lapply(names(ll), function(X) { 
    assign(X, ll[[X]]) 
    save(list=X, file=paste0(X, ".Rdata")) 
}) 
+0

+1,list甚至可以保存完全不同的對象,如作爲第一個元素的'data.frame',作爲第二個元素的'list',作爲第三個對象的'lm'的結果。 –

+0

@PaulHiemstra - 很高興你不介意我加這個。我只知道當我是一名R初學者時,那些文件寫作結構對我來說是多麼省時... –

5

你是什麼尋找是list。 您可以使用像lapply這樣的函數來以相同的方式對待每個數據幀。但是,在某些情況下,您需要將數據幀列表傳遞給相互處理數據幀的函數。在這種情況下lapply不會幫助你。

這就是爲什麼重要的是要注意如何訪問和迭代列表中的數據幀。它的完成是這樣的:

mylist[[data frame]][row,column] 

注意圍繞你的數據幀索引的雙括號。 因此,對於你的例子這將是

df1 <- data.frame(c(1,2,3), c(4,5,6)) 
df2 <- data.frame(c(11,22,33), c(44,55,66)) 
mylist<-list(df1,df2) 

mylist[[1]][1,2]將返回4,而mylist[1][1,2]將返回NULL。我花了一段時間才找到這個,所以我認爲在這裏發佈可能會有所幫助。

相關問題