2016-07-14 3 views
0

私は購入データを持っています。各購入は1つ以上の製品で構成されます。私は、消費者が一度に1つの製品しか購入しない場合(ソロ製品の購入)に興味があります。私は各製品を購入した回数と各バスケットの品目の数を計算することができます。var2とvar1がdata.tableを使用して一意に関連付けられている回数(割合)

商品が1つの商品を購入した時間を知りたい。

私は実際のデータが巨大であるため、data.tableを使用する必要があります。

私はおもちゃのデータセットを仕上げました。

library(data.table) 
DT <- data.table(id = 1:13, basket_id = c(1,1,2,3,4,4,5,5,6,7,7,7,8), prod_id = c(1,2,2,3,2,1,3,4,1,1,3,4,5)) 

# Count number of times each product is purchased 
DT[,`:=`(NPurchased=.N),by=.(prod_id)] 

# Count number of purchases in each basket 
DT[,`:=`(BasketSize=.N), by=.(basket_id)] 

#Number of times product appears with a BasketSize of 1 
DT[BasketSize==1,`:=`(NPurchSolo =.N),by=.(prod_id)] 

私は、次のステップは、NAがNorgsoloに0に値置き換えることだろうと思ったが、私は

DT[is.na(NPurchSolo),NPurchSolo:=0,with=FALSE] 

を追加するとき、私は、私はおそらく将来的に無効なタイプ(行列)である」エラーが出ます2列の行列は、DTの要素のリストを返すことができます(FAQ 2.14のA [B]の精神の中で)。あなたがこれを望むかどうかをdatatable-helpに知らせるか、FR#657にあなたのコメントを追加してください "

これが最善の方法ですか?もしそうなら、私の間違いは何ですか?または、var2がdata.tableを使用してvar1と一意に関連付けられている時間の数(割合)を計算する簡単な方法はありますか?

私の所望の出力は

prod_id NPurchSolo NPurchased proportion_solo 
1  1   4   .25 
2  1   3   .33333 
3  1   3   .33333 
4  2   0   0 
5  1   1   1 
+0

そして私は私の最初の間違いは、私はまだ私は午前どこから取得するかどうかは確認していない= FALSE.Butであることを指摘した同僚をつかん私はどこにいたいですか?私はこの質問があいまいであることは知っていますが、おそらく誰かが私よりもはるかにはっきりとパスを見ることができます。 – Danielle

答えて

2

エントリでdata.table誰かが右のトラックに私を得た答えを掲載されていますが、現在は削除されます。それは私に次のことを理解させました。 (編集:最初の行は本当に必要はありません)

DT[, NpurchSolo := sum(BasketSize == 1), .(prod_id)] 
FINAL=DT[, .(Npurchased = unique(NPurchased), NpurchSolo = sum(BasketSize == 1)), .(prod_id)] 
FINAL[, proportion_solo := (NpurchSolo/Npurchased)] 

> show(FINAL) 
    prod_id Npurchased NpurchSolo proportion_solo 
1:  1   4   1  0.2500000 
2:  2   3   1  0.3333333 
3:  3   3   1  0.3333333 
4:  4   2   0  0.0000000 
5:  5   1   1  1.0000000 
関連する問題