0

私はこれを無駄にかなり検索しましたが、自分で機能させようとしたことは言うまでもありません。

私はこのdata.tableを持っています:

 DT = data.table(date=rep(c(as.Date("2010-01-01"),as.Date("2010-01-02")), each=3),       bucket=rep(c("bucket1","bucket2","bucket3"),each=2),
kbucket=c("(0,.5]","(.5,1]","(1,1.5]","(1.5,2]","(1.5,2]","(2.5,3]"),vol=1:6,o=10:15,m=20:25)

次のようになります。

         date  bucket kbucket vol  o  m
1: 2010-01-01 bucket1  (0,.5]   1 10 20
2: 2010-01-01 bucket1  (.5,1]   2 11 21
3: 2010-01-01 bucket2 (1,1.5]   3 12 22
4: 2010-01-02 bucket2 (1.5,2]   4 13 23
5: 2010-01-02 bucket3 (1.5,2]   5 14 24
6: 2010-01-02 bucket3 (2.5,3]   6 15 25

DT の複製である DF で ddply を使用しましたが、これはデータ フレームです。

out <- ddply(DF,.(date,bucket,kbucket),wrap_summarize)

ここで、wrap_summarize は次のように定義されています。

 wrap_summarize = function(x)  
                  { 
                       out <-  summarize(  x,
                       N = length(x$date),
                       sumVol = sum(x$vol),
                       sumO = sum(x$o),
                       avgM = mean(x$m,na.rm=TRUE))

                  }

取得するため

        date  bucket kbucket N sumVol sumO avgM
1 2010-01-01 bucket1  (.5,1] 1      2   11   21
2 2010-01-01 bucket1  (0,.5] 1      1   10   20
3 2010-01-01 bucket2 (1,1.5] 1      3   12   22
4 2010-01-02 bucket2 (1.5,2] 1      4   13   23
5 2010-01-02 bucket3 (1.5,2] 1      5   14   24
6 2010-01-02 bucket3 (2.5,3] 1      6   15   25

これは望ましい結果です。

実際のデータはこの構造ですが、数十万行です。したがって、data.table メソッドが必要です。だから私はこれを試します:

test <- DT[,list(N=length(DT$date),sumVol=sum(DT$vol),sumO=sum(DT$o),avgM=mean(DT$m,na.rm=T)),
by=list(date,bucket,kbucket)]

取得するだけで、これは明らかに望んでいるものではありません:

         date  bucket kbucket N sumVol sumO avgM
1: 2010-01-01 bucket1  (0,.5] 6     21   75 22.5
2: 2010-01-01 bucket1  (.5,1] 6     21   75 22.5
3: 2010-01-01 bucket2 (1,1.5] 6     21   75 22.5
4: 2010-01-02 bucket2 (1.5,2] 6     21   75 22.5
5: 2010-01-02 bucket3 (1.5,2] 6     21   75 22.5
6: 2010-01-02 bucket3 (2.5,3] 6     21   75 22.5

ここでは .SD を使用する必要があると思いますが、この時点で、最も効率的な解決策が得られない場合は、この問題を尋ねて共有するのが最善だと思いました。前もって感謝します!

4

1 に答える 1

0

あなたはこれを探しています:

DT[,list(
    .N,
    sumVol=sum(vol),
    sumO=sum(o),
    avgM=mean(m,na.rm=T)
),by=list(date,bucket,kbucket)]

を与える

#          date  bucket kbucket N sumVol sumO avgM
# 1: 2010-01-01 bucket1  (0,.5] 1      1   10   20
# 2: 2010-01-01 bucket1  (.5,1] 1      2   11   21
# 3: 2010-01-01 bucket2 (1,1.5] 1      3   12   22
# 4: 2010-01-02 bucket2 (1.5,2] 1      4   13   23
# 5: 2010-01-02 bucket3 (1.5,2] 1      5   14   24
# 6: 2010-01-02 bucket3 (2.5,3] 1      6   15   25
于 2013-05-20T02:01:21.450 に答える