2012-01-06 149 views
3

我在R如果我把它應用到超過1000行的數據集電抗器的功能。因此,我想將我的數據集分成n個塊,每個塊不超過1000行。把一個數據集分成塊

這裏是我目前使用做分塊的功能:

chunkData <- function(Data,chunkSize){ 
    Chunks <- floor(0:(nrow(Data)-1)/(chunkSize)) 
    lapply(unique(Chunks),function(x) Data[Chunks==x,]) 
} 
chunkData(iris,100) 

我想使這個功能更高效,使其運行在大型數據集的速度更快。

+1

爲什麼不解決這個問題上有超過1000行對象扼流圈的功能? – 2012-01-06 19:19:23

+0

是的,真的!您可能只需要瞭解內存管理,或者瞭解如何(而不是)組織數據。另外,定義「扼殺」。僅僅因爲1000行(*多少列)在你感到無聊之前完成,並不意味着10^5行的淨處理時間得到了改善。 – 2012-01-06 22:28:56

+0

@CarlWitthoft和Josh:謝謝你的建議。我已經對這個函數進行了很多優化,但是它涉及到大量的數據轉換,它們吸收了內存,我認爲這是不可避免的。我實際上決定把它吸起來並逐行應用這個函數,這需要很長時間,但不會耗盡內存。 – Zach 2012-01-06 23:32:04

回答

7

您可以使用base R中的split輕鬆完成此操作。例如,split(iris, 1:3)將按行將數據集拆分爲三個數據框的列表。您可以修改參數以指定塊大小。

因爲輸出仍然是數據幀的列表,你可以很容易地使用lapply在輸出處理數據,並根據需要將它們結合起來。

由於速度是使用此方法的主要問題,因此我建議您查看data.table程序包,該程序包適用於大型數據集。如果您在自己的功能中指定了更多關於您想實現的信息,則SO中的人員可能會提供幫助。

+0

我從來沒有聽說過拆分功能。很高興發現我的問題在基本R中得到了優雅的解決! – Zach 2012-01-06 19:57:20

+0

是的。 'base'中有幾個這樣的隱藏寶石。 – Ramnath 2012-01-06 20:04:14

3

更換lapply()呼叫通過調用split()

split(Data, Chunks) 
2

你也應該看看ddply FOM的plyr包,這個包是圍繞裂應用於-結合的原則建立。 This paper about the package解釋了這是如何工作的,以及plyr中可用的東西。

我會採取這裏的一般策略是一個新的數據添加到一個名爲chunkid數據集。這將以1000行的塊形式切割數據,查看rep函數來創建該行。然後,你可以這樣做:

result = ddply(dat, .(chunkid), functionToPerform) 

我喜歡plyr以其清晰的語法和結構,其支持並行處理。前面已經說了,也請看一看data.table,這可能是一個相當快一點在some situations

一個額外的小費可能是使用data.frames代替矩陣...