0

以下があるとしましょう。

time=c(20060200,20060200,20060200,20060200,20060200,20060300,20060400,20060400,20060400)
bucket=c(1,1,2,2,1,3,3,3,1)
rate=c(0.05,0.04,0.04,0.05,0.06,0.01,0.07,0.08,0.03)




       time bucket rate
1: 20060200      1 0.05
2: 20060200      1 0.04
3: 20060200      2 0.04
4: 20060200      2 0.05
5: 20060200      1 0.06
6: 20060300      3 0.01
7: 20060400      3 0.07
8: 20060400      3 0.08
9: 20060400      1 0.03

このような方法でレートを時間またはバケットに集計する方法を知っています

test=data.table(time,bucket,rate)
b=test[,list(x=sum(rate)),by=bucket]

私の質問は、時間をそのままにしながらバケットに集約する方法です。
だから私が欲しいのは次のようなものです:

20060200  1  0.15
20060200  2  0.09
20060200  3  0
20060300  1  0
20060300  2  0
20060300  3  0.01 
20060400  1  0.03
20060400  2  0
20060400  3  0.15

これが明確であることを願っています、ありがとう

4

2 に答える 2

5

@Mittenchops が言ったように、デカルト積を探しています。これには関数がありCJます。で思い通りのコンボができますunique(CJ(time,bucket))。これを data.table で使用するには、(i) キーを設定し、(ii) CJ と結合します。

setkey(test,time,bucket)
b <- test[unique(CJ(time,bucket)),list(x=sum(rate))]
b[is.na(x),x:=0]

最後のステップでは、欠損値を 0 に設定します。結果は次のとおりです。

       time bucket    x
1: 20060200      1 0.15
2: 20060200      2 0.09
3: 20060200      3 0.00
4: 20060300      1 0.00
5: 20060300      2 0.00
6: 20060300      3 0.01
7: 20060400      1 0.03
8: 20060400      2 0.00
9: 20060400      3 0.15

ところで、x[y,...]構文 (x と y はどちらも data.tables)を使用して「結合」すると、 byx のキー (おそらく最初の部分のみ) に隠された ...a by-without-by... が存在します。 . 詳細については、ドキュメントまたは Google で「by-without-by」を検索してください。

于 2013-08-27T17:48:49.427 に答える
0

あなたの質問を難しくしているのは、集計ではなく、集計によって残されたギャップを埋めるために、グループごとに時間のデカルト積を作成することです。これを達成するためのフラグが関数にあれば素晴らしいのですが、そうではないようです。

したがって、これはエレガントではありませんが、その構造を構築し、集計の結果をその足場に移植することにより、それを達成する1つのソリューションを次に示します。

df <- aggregate(rate~., data=test, sum)
> df
      time bucket rate
1 20060200      1 0.15
2 20060400      1 0.03
3 20060200      2 0.09
4 20060300      3 0.01
5 20060400      3 0.15

デカルトの足場を作成するために必要なレベルを計算します。この場合、常にすべてのグループで行います。

> levels(factor(bucket))
[1] "1" "2" "3"
> levels(factor(time))
[1] "20060200" "20060300" "20060400"
> B <- levels(factor(bucket))
> t <- levels(factor(time))

結果をグラフトするためのラティス ベースを作成します。

> base <- expand.grid(B,t)
> names(base) <-c("bucket","time")
> base
  bucket     time
1      1 20060200
2      2 20060200
3      3 20060200
4      1 20060300
5      2 20060300
6      3 20060300
7      1 20060400
8      2 20060400
9      3 20060400

データフレームをベースにマージします。

> m <- merge(base,df,all.x=T)
  bucket     time rate
1      1 20060200 0.15
2      1 20060300   NA
3      1 20060400 0.03
4      2 20060200 0.09
5      2 20060300   NA
6      2 20060400   NA
7      3 20060200   NA
8      3 20060300 0.01
9      3 20060400 0.15

NA を 0 に置き換えます。

m$rate[is.na(m$rate)] <- 0
> m
  bucket     time rate
1      1 20060200 0.15
2      1 20060300 0.00
3      1 20060400 0.03
4      2 20060200 0.09
5      2 20060300 0.00
6      2 20060400 0.00
7      3 20060200 0.00
8      3 20060300 0.01
9      3 20060400 0.15

並べ替えて、目的の出力を取得します。

> m[with(m,order(time,bucket)),]
  bucket     time rate
1      1 20060200 0.15
4      2 20060200 0.09
7      3 20060200 0.00
2      1 20060300 0.00
5      2 20060300 0.00
8      3 20060300 0.01
3      1 20060400 0.03
6      2 20060400 0.00
9      3 20060400 0.15
于 2013-08-27T17:24:28.680 に答える