2013-07-22 4 views
2

I R은 문제, 그것이 생성하는 출력 단순히 분할 조건을 고려하지 않고 누적 합R 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) 

ffdfdply 기능을 갖는다.

나는이

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) 각각의 id를 얻는 특성) – thelatemail

+0

cumsum_a_c : = cumsum (x $ d) 대신 cumsum_a_c : = cumsum (d)를 사용하십시오. 이것이 FUN 내부의 올바른 data.table 구문입니다. – jwijffels

답변

4

올바른 사용은 2 열로 분할 할 경우이

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) 

, 단지 새 열 둘을 결합하게 될 것입니다 열로 나누어서 사용하십시오.해당 열을 만들려면 을 참조하십시오.

+0

큰 데이터가있는 경우 x <- as.data.table (x)가 메모리 문제를 생성한다고 가정합니다. – Ajay

+0

아니요, 메모리 문제는 없습니다. 'x'에서 얻는 것은 하나 또는 여러 개의 분리 된 요소의 데이터 그룹이 RAM에 저장되는 'a'ffdf의 하위 집합입니다. RAM에 넣고 FUN을 적용 할 서브 세트의 크기는 BATCHBYTES에 의해 제어됩니다. – jwijffels

+0

감사합니다 ... Thats great – Ajay

1

이 기능은 실제로 데이터를 분할하지 않습니다 ?ffdfdply

에서, 여기에 어느 정도 도움이된다. 스플릿 레벨이 많은 상황에서 데이터를 RAM에 넣는 횟수를 으로 줄이려면 분할 요소 그룹을 추출합니다. 분할 요소 그룹은 BATCHBYTES에 따라 RAM에 넣을 수 있습니다 ( ).

와 ....

들은 여러분의 재미에 여러 분할 요소 재미가 적용되는 의 데이터를 하나의 덩어리에있을 수 있다는 사실을 다루고 있는지 확인하십시오.

내 독서에서 실제로 당신이 ffdfdply 함수에서 그룹 내에서 작동하는 split-combine-style 함수가 필요합니다. 그래서 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

그렇습니다. 의사가 "FUN이 적용된 여러 개의 데이터 덩어리에 여러 개의 분할 요소가 포함될 수 있다는 사실을 FUN이 확실히 다루고 있는지 확인하십시오." – jwijffels