我想編寫一個循環來從一組已經存在的矩陣創建多個數據幀。 我已經導入和使用的代碼創建這些:多次應用運算符'data.frame'的循環
temp<-list.files(pattern="*.csv")
ddives <- lapply(temp, read.csv)
所以「ddives」是我一套一套的CSV文件。我現在想用代碼的循環版本來創建一個數據幀從每一項的:
d.dives1<- data.frame(ddives[1])
我想編寫一個循環來從一組已經存在的矩陣創建多個數據幀。 我已經導入和使用的代碼創建這些:多次應用運算符'data.frame'的循環
temp<-list.files(pattern="*.csv")
ddives <- lapply(temp, read.csv)
所以「ddives」是我一套一套的CSV文件。我現在想用代碼的循環版本來創建一個數據幀從每一項的:
d.dives1<- data.frame(ddives[1])
由於這是一個跟進到您發佈的較早前的問題,試試這個:
for (i in 1:length(ddives)) assign(temp[i], ddives[[i]])
然後,您可以再次使用ddives [[i]] - 因爲列表中的每個元素都應該是一個數據幀,所以不需要其他所有的廢話。 – Dason 2012-07-11 16:22:39
@Dason,我完全同意你的看法。這就是爲什麼我以我的方式回答了[原始問題](http://stackoverflow.com/questions/11433432/importing-multiple-csv-files-into-r)。現在我只是提供*這個問題的答案。 **當我可以使用列表索引功能時,我不希望我的工作空間充滿165個文件。 – A5C1D2H2I1M1N2O1R2T1 2012-07-11 16:26:40
我實際上是在轉讓聲明中談論的。你爲什麼只用ddives [[i]]就可以使用data.frame(unlist(stuff))?它應該做同樣的事情不應該嗎? – Dason 2012-07-11 16:29:07
關於術語的快速入門之前,我回答你的問題:
read.csv()
結果一個data.frame
。lapply()
的結果是list
。因此,您現在有一個數據框的列表。
如果你可以安全地假設,在列表中的數據幀具有相同的結構(即相同的列數和相同的類),那麼你可以使用rbind()
您的數據幀列表合併成一個單一data.frame
。
爲了使這個簡單,你可以使用do.call()
如下:
do.call(rbind, ddives)
do.call
使用列表元素作爲參數從構造函數的調用。如果它們被命名,則它們將作爲命名參數傳遞,否則按順序傳遞(如同在R中一樣)。在這種情況下,您將rbind
應用於列表中的所有元素,從而創建一個data.frame
。
由於我沒有您的數據,因此這顯然未經測試。但是,一般來說,do.call
對於這種類型的操作是非常有用的功能。
我會小心地說'do.call''將函數應用於列表'。它使用列表的元素作爲給定函數的參數。我認爲'lapply'可以更充分地用'將函數應用於列表'來描述。 – Dason 2012-07-11 16:12:44
@Dason公平點。將編輯我的答案, – Andrie 2012-07-11 16:26:05
好的答案(和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
如果你真的想你的代碼的一個環形的版本,這將是:
for (i in 1:length(ddives)){
assign(paste("d.dives", i, sep =""), ddives[i])
}
.. 。read.csv是否已經返回一個data.frame? – Dason 2012-07-11 15:55:56
不幸的是,使用此代碼它剛剛返回了165(我有文件數)列表,我需要將其轉換爲數據幀 – 2012-07-11 16:02:25
我非常懷疑它返回了165個列表。它更有可能返回1個包含165個數據幀的列表作爲元素。 ddives [[1]]會給你第一個data.frame,ddives [[2]]會給你第二個... – Dason 2012-07-11 16:03:51