2016-12-15 10 views
1

私は、1店舗あたりの週あたりのユニークな顧客の数を決定しようとしています。ユニークなインスタンスを2つのグループでR

私はこのタスクを達成するコードを持っていますが、私が探しているものではありません。

私は以下の表を持っている:

store week customer_ID 
1   1 1 
1   1 1 
1   1 2 
1   2 1 
1   2 2 
1   2 3 
2   1 1 
2   1 1 
2   1 2 
2   2 2 
2   2 3 
2   2 3 

だから毎週私がいたどのように多くのユニークな顧客カウントする必要があります。

たとえば、顧客1が第1週に訪問した後、第2週に再訪してユニークな訪問としてカウントされないとします。

同じ顧客が週1または他の週に店舗2を訪問した場合。それは店舗2のユニークな訪問と見なされます。

結果は次のようになります。

store week unique Customers 
1   1 2 
1   2 1 
2   1 2 
2   2 1 

を私は次のように使用されるが、ここではその正しくない

agg <- aggregate(data=df, customer_ID~ week+store, function(x) length(unique(x))) 

structure(list(store = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L), week = c(1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 
2L, 2L), customer_ID = c(1L, 1L, 2L, 1L, 2L, 3L, 1L, 1L, 2L, 
2L, 3L, 3L)), .Names = c("store", "week", "customer_ID"), class = "data.frame", row.names = c(NA, 
-12L)) 

答えて

2

は、基本R方式です。アイデアは、データを各ストアごとに1つのdata.framesのリストに分割することです。観察を週単位で行うと仮定すると、顧客IDの重複した観測を削除します。サブセットdata.frameは、関数を使用して集約されます。あなたのdata.frameを前に、これを試みるに適切に順序付けられている、あなたはorderを使用することができることを確認するために

do.call(rbind, lapply(split(df, df$store), 
         function(i) aggregate(data=i[!duplicated(i$customer_ID),], 
              customer_ID ~ week+store, length))) 
    week store customer_ID 
1.1 1  1   2 
1.2 2  1   1 
2.1 1  2   2 
2.2 2  2   1 

:次にdo.callrbindは、単一data.frameに結果を入れ

df <- df[order(df$store, df$week), ] 

興味がある場合は、data.table溶液も一緒に入れます。

df[df[, !duplicated(customer_ID), by=store]$V1, 
    .(newCust=length(customer_ID)), by=.(store, week)] 
    store week newCust 
1:  1 1  2 
2:  1 2  1 
3:  2 1  2 
4:  2 2  1 

ライブラリ(data.table) SETDT(DF)このメソッドは、ストアによって一意IDにデータをサブセットに論理ベクトルdf[, !duplicated(customer_ID), by=store]$V1を使用し、次いでストアによって新規顧客の固有番号を算出します-週間。

+0

そのコードを実行する前に、私は週だけ手配してください。または週と店舗で? – daveDo

+0

@Imo分かりやすくするためにアレンジ/オーダー機能を含めることができますか? – daveDo

+0

これにdata.table/dplyrソリューションがあるのだろうかと疑問に思っていましたか? –