2013-07-22 48 views
2

我有其中R問題,ffdfdply功能řffdfdply分裂問題

a=as.ffdf(data.frame(b=11:20,c=c(4,4,4,4,4,5,5,5,5,5), d=c(1,1,1,0,0,0,1,0,1,1))) 

ffdfdply(a, split=a$c, FUN= function(x) {data.frame(cumsum(x$d))}, trace=T) 

它產生的輸出是簡單地不考慮分割準則的累積和。

我需要這樣的

c cumsum 
4 1 
4 2 
4 3 
4 4 
4 4 
5 0 
5 1 
5 1 
5 2 
5 3 

輸出我們可以包括「分裂」下的多個列?如果有人提供了一個例子,這將是非常棒的。

謝謝。


@jwijffels,我對另一組數據

i=as.ffdf(data.frame(a=c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2), b=c(1,4,6,2,5,3,1,4,3,2,8,7,1,3,5,4,2,6,3,1,2), c=c(1,1,1,1,1,1,2,2,2,2,1,1,1,1,1,1,1,1,2,2,2), d=c(1,0,1,1,0,1,0,1,1,0,0,1,1,1,0,0,1,1,1,1,0))) 

我收到的輸出是不正確的測試解決方案。我需要a列和c列的累積和d列。

下面的步驟是正確的,給了正確的結果

idx <- ffdforder(i[c("a","c","b")]) 
ordered_i <- i[idx, ] 
ordered_i$key_a_c <- ikey(ordered_i[c("a", "c")]) 

,但是當我嘗試累計總和,得到不正確的結果。

cumsum_i <- ffdfdply(ordered_i, split=as.character(ordered_i$key_a_c), FUN= function(x) { 
    ## Data in RAM, on which you can use data.table 
    x <- as.data.table(x) 
    result <- x[, cumsum_a_c := cumsum(x$d), by = list(key_a_c)] 
    as.data.frame(result) 
}, trace=T) 

請幫忙。我需要在大數據上運行這些命令。

+0

可能重複[使用ffdfdply來拆分數據並獲得每個id在拆分中的特徵](http://stackoverflow.com/questions/10981384/using-ffdfdply-to-split-data -and-GET-特性 - 的 - 每個-ID-中最分裂 – thelatemail

+0

使用cumsum_a_c):不是cumsum_a_c = cumsum(d):= cumsum(X $ d)。這是FUN中正確的data.table語法。 – jwijffels

回答

4

正確的用法將是

require(ffbase) 
require(data.table) 
a=as.ffdf(data.frame(b=11:20,c=c(4,4,4,4,4,5,5,5,5,5), d=c(1,1,1,0,0,0,1,0,1,1))) 
ffdfdply(a, split=as.character(a$c), FUN= function(x) { 
    ## Data in RAM, on which you can use data.table 
    x <- as.data.table(x) 
    result <- x[, cumsum := cumsum(d), by = list(c)] 
    as.data.frame(result) 
    }, trace=T) 

如果你想通過2列拆分,只是做一個新列組合這兩個列並將其用作分割。見?ikey創建該列

+0

如果我們有一個大數據,那麼我認爲x < - as.data.table(x)會產生內存問題。 – Ajay

+0

不,你不會有內存問題。你在'x'中得到的是'a'ffdf的一個子集,其中一個或多個拆分元素的數據組被放入RAM中。您放入RAM並在其上應用FUN的子集的大小由BATCHBYTES控制。 – jwijffels

+0

謝謝...那是偉大的 – Ajay

1

閱讀幫助是有點用在這裏,從?ffdfdply

這個功能實際上並沒有分割數據。爲了減少 數據在分割級別很多的情況下被放入RAM的次數,該功能提取根據BATCHBYTES可以將 放入RAM的分割元素組。

與....

請確保你的樂趣覆蓋的事實,一些裂元件可以在其上施加FUN 數據的一個大塊。

所以從我的,閱讀實際上你需要有一個分結合風格的功能對工作組的功能在你的ffdfdply以及調用。像這樣利用ave

a$c <- with(a, as.integer(c)) 
ffdfdply(
    a, 
    split=a$c, 
    function(x) data.frame(c=x$c,cumsum=ave(x$d,x$c,FUN=cumsum)), 
    trace=T 
) 

結果:

c cumsum 
1 4  1 
2 4  2 
3 4  3 
4 4  3 
5 4  3 
6 5  0 
7 5  1 
8 5  1 
9 5  2 
10 5  3 
+0

謝謝..請糾正我,如果我錯了。 BATCHBYTES在ffdfdply中發揮着重要作用。如果我們不確定數據,並且固定的BATCHBYTES將導致不一致的結果。你可以舉一個例子,在拆分下包含多個列。 – Ajay

+0

@Ajay - 我不是'ff'很內行,但它聽起來像是'ffdfdply'能可能需要數分團成一個'BATCHBYTE'根據每個組的大小和BATCHBYTE'的'大小。因此,您必須擁有**另一個**分組功能,以防批次中存在> 1個組。 – thelatemail

+0

是的,這就是爲什麼DOC狀態「請確保你的樂趣覆蓋的事實,一些裂元件可以在其上施加FUN一個數據塊。」 – jwijffels