2012-07-11 24 views
0

我想編寫一個循環來從一組已經存在的矩陣創建多個數據幀。 我已經導入和使用的代碼創建這些:多次應用運算符'data.frame'的循環

temp<-list.files(pattern="*.csv") 
ddives <- lapply(temp, read.csv) 

所以「ddives」是我一套一套的CSV文件。我現在想用代碼的循環版本來創建一個數據幀從每一項的:

d.dives1<- data.frame(ddives[1]) 
+1

.. 。read.csv是否已經返回一個data.frame? – Dason 2012-07-11 15:55:56

+0

不幸的是,使用此代碼它剛剛返回了165(我有文件數)列表,我需要將其轉換爲數據幀 – 2012-07-11 16:02:25

+1

我非常懷疑它返回了165個列表。它更有可能返回1個包含165個數據幀的列表作爲元素。 ddives [[1]]會給你第一個data.frame,ddives [[2]]會給你第二個... – Dason 2012-07-11 16:03:51

回答

1

由於這是一個跟進到您發佈的較早前的問題,試試這個:

for (i in 1:length(ddives)) assign(temp[i], ddives[[i]]) 
+2

然後,您可以再次使用ddives [[i]] - 因爲列表中的每個元素都應該是一個數據幀,所以不需要其他所有的廢話。 – Dason 2012-07-11 16:22:39

+0

@Dason,我完全同意你的看法。這就是爲什麼我以我的方式回答了[原始問題](http://stackoverflow.com/questions/11433432/importing-multiple-csv-files-into-r)。現在我只是提供*這個問題的答案。 **當我可以使用列表索引功能時,我不希望我的工作空間充滿165個文件。 – A5C1D2H2I1M1N2O1R2T1 2012-07-11 16:26:40

+0

我實際上是在轉讓聲明中談論的。你爲什麼只用ddives [[i]]就可以使用data.frame(unlist(stuff))?它應該做同樣的事情不應該嗎? – Dason 2012-07-11 16:29:07

7

關於術語的快速入門之前,我回答你的問題:

  1. read.csv()結果一個data.frame
  2. lapply()的結果是list

因此,您現在有一個數據框的列表。

如果你可以安全地假設,在列表中的數據幀具有相同的結構(即相同的列數和相同的類),那麼你可以使用rbind()您的數據幀列表合併成一個單一data.frame

爲了使這個簡單,你可以使用do.call()如下:

do.call(rbind, ddives) 

do.call使用列表元素作爲參數從構造函數的調用。如果它們被命名,則它們將作爲命名參數傳遞,否則按順序傳遞(如同在R中一樣)。在這種情況下,您將rbind應用於列表中的所有元素,從而創建一個data.frame


由於我沒有您的數據,因此這顯然未經測試。但是,一般來說,do.call對於這種類型的操作是非常有用的功能。

+0

我會小心地說'do.call''將函數應用於列表'。它使用列表的元素作爲給定函數的參數。我認爲'lapply'可以更充分地用'將函數應用於列表'來描述。 – Dason 2012-07-11 16:12:44

+0

@Dason公平點。將編輯我的答案, – Andrie 2012-07-11 16:26:05

+0

好的答案(和upvoted)。這是個挑剔的問題,但是由於我們處於細節......'do.call'使用list元素作爲_arguments_構造函數調用。如果它們被命名,它們將作爲命名參數傳遞,否則按照「R」中的順序傳遞。所以對於'mean'函數的默認方法:'function(x,trim = 0,na.rm = FALSE,...)'產生不同的結果:'do.call(「mean」,list(x = c(1:10,NA),na.rm = TRUE))','do.call(「mean」,list(x = c(1:10,NA),TRUE))','do.call 「mean」,list(c(1:10,NA),na.rm = TRUE))'。 – Joshua 2012-07-11 17:00:27

0

如果你真的想你的代碼的一個環形的版本,這將是:

for (i in 1:length(ddives)){ 
    assign(paste("d.dives", i, sep =""), ddives[i]) 
}