2012-06-11 35 views
1

在R中我使用ffdf來處理大型數據集。我想使用ffbase包中的ffdfdply根據某個變量(var)分割數據,然後使用var的唯一值爲所有觀察值計算一些特徵(例如:var的每個唯一值的觀察值數目)。用ffdfdply來查看這是否可行,我執行了下面描述的例子。使用ffdfdply拆分數據並獲得拆分中每個id的特徵

我預計它會分裂每個物種,然後計算最小Petal.Width每個Species,然後返回一個每兩列三個條目列出了此SpeciesSpecies和最小Petal.Width。預期輸出:

Species min_pw 
1 setosa  0.1  
2 versicolor 1.0  
3 virginica 1.4 

然而對於BATCHBYTES=5000它將使用兩個狹縫,一個含有兩個物種和其它含有一個物種。這將導致以下:

Species min_pw 
1 setosa 0.1  
2 virginica 1.4  

當我改變BATCHBYTES到2000年,這將迫使ffdfdply用三次分裂,從而導致上述公佈的預期輸出。不過,我想有另一種方法來強制分割分配給'split'的變量的每個唯一值。有什麼辦法可以做到這一點嗎?或者您有任何其他建議來獲得我需要的結果嗎?

ffiris <- as.ffdf(iris) 
result <- ffdfdply(x = ffiris, 
        split = ffiris$Species, 
        FUN = function(x) { 
         min_pw <- min(x$Petal.Width) 
         data.frame(Species=x$Species, min_pw= min_pw) 
        }, 
        BATCHBYTES = 5000, 
        trace=TRUE 
) 
dim(result) 
dim(iris) 
result 

回答

5

函數ffdfdply是在您有很多拆分元素時設計的,例如當你有1000000個客戶,並且你希望內存中的數據至少被客戶分割,但是如果你的內存允許內部不需要做1000000次這樣的分配,可能會有更多的客戶。 這就是爲什麼ffdfdply狀態的文檔:

請確保你的樂趣覆蓋的事實,一些裂元件可以在其上施加FUN一個數據塊「。 因此,針對您的問題的解決方案是在FUN中覆蓋這一點,即如下所示。

FUN=function(x){ 
    require(doBy) 
    summaryBy(Petal.Width ~ Species, data=x, keep.names=TRUE, FUN=min) 
}