0

次の列を含むデータに基づいて要約を作成しようとしています。

    Trx_Date   Brand   Cust_Num   Item_Qty   Item_Price

さまざまなブランド(キャラクターオブジェクトクラス)について、その年の各週に基づいてItem_QtyとItem_Amtの要約を作成しようとしています。私は次の方法でWk_Numを作成することができました。

    Wk_Num <- as.character(strftime(as.POSIXlt(Trx_Date), format="%W"))

私がやろうとしているのは、Wk_Num + Brandの組み合わせごとに、Item_Qtyの合計とItem_Priceの平均を取得することです。私は次の方法で欲しいものを手に入れることができます:

   tblsum <- summary(Item_Price + Item_Qty ~ Wk_Num + Brand, data=tblorig, FUN = function(x) { c(m = mean(x), s= sum(x))})

私がやりたいのは、特定のWk_Num + Brandの組み合わせごとに、すべての購入者の合計(つまり、浸透)に対する購入者の割合を計算する別の列を作成することです。上記のコードを修正して、長さも計算できます(各組み合わせの「購入者」の数を取得するため)。

   tblsum <- summary(Item_Price + Item_Qty ~ Wk_Num + Brand, data=tblorig, FUN = function(x) { c(m = mean(x), s= sum(x), l=length(x))})

ただし、これにも欠陥があります。顧客は実際には1週間以内に複数回購入する可能性があり、二重にカウントされるためです。

私はまだRの旅の早い段階で、エレガントにコーディングしようとしています。最初のコードから作成したデータの概要を組み合わせて、一意のCust_Numの総数に対する各Wk_Num + Brandの組み合わせの一意のCust_Numの割合を計算する良い方法はありますか?

コードの改善も大歓迎です。

アップデート:

サンプルデータ:

 Wk_Num   Brand      Cust_Num   Item_Qty   Item_Price
 11       AAA           001          1          2.1
 11       BBB           001          1          1.4
 11       AAA           002          2          2.1
 12       CCC           003          1          1.5
 12       BBB           001          3          1.4
 12       BBB           001          2          1.4
 12       BBB           004          1          1.5
 12       CCC           004          1          1.5
 13       AAA           002          2          2.2
 13       AAA           001          3          2.1
 13       AAA           003          1          2.2
 13       AAA           004          2          2.1

出力として理想的なものは次のとおりです。

 Wk_Num   Brand     Total Item  Avg Item Price   Penetration
 11       AAA             3        2.10              50%         # 2 out of 4
 11       BBB             1        1.40              25%         # 1 out of 4
 12       BBB             6        1.43              50%         # 2 out of 4 (Cust 001 bought twice in that week)
 12       CCC             1        1.50              25%         # 1 out of 4
 13       AAA             8        2.15             100%         # 4 out of 4
4

2 に答える 2

4

パッケージのddply関数を使用できます:plyr

(データフレームが と呼ばれると仮定しますdat。)

library(plyr)
ddply(dat, .(Wk_Num, Brand), summarise, 
      Total_Item = sum(Item_Qty), 
      Avg_Item_Price = mean(Item_Price),
      Penetration = length(unique(Cust_Num))/length(unique(dat$Cust_Num)))

結果:

  Wk_Num Brand Total_Item Avg_Item_Price Penetration
1     11   AAA          3       2.100000        0.50
2     11   BBB          1       1.400000        0.25
3     12   BBB          6       1.433333        0.50
4     12   CCC          2       1.500000        0.50
5     13   AAA          8       2.150000        1.00
于 2013-01-09T13:51:15.260 に答える
3

使用data.table:

require(data.table)
x.dt <- data.table(dat)
yy <- x.dt[, list(Total_Item = sum(Item_Qty), Avg_Item_Price = mean(Item_Price),
            Penetration = length(unique(Cust_Num))/length(unique(x.dt$Cust_Num))), 
            by="Wk_Num,Brand"]
于 2013-01-09T14:01:34.700 に答える