2017-05-19 16 views
6

データセットtestについては、私の目的は、期間ごとに1つの期間から次の期間に繰り越されたユニークユーザーの数を調べることです。Rの単純な保持の計算R

> test 
    user_id period 
1  1  1 
2  5  1 
3  1  1 
4  3  1 
5  4  1 
6  2  2 
7  3  2 
8  2  2 
9  3  2 
10  1  2 
11  5  3 
12  5  3 
13  2  3 
14  1  3 
15  4  3 
16  5  4 
17  5  4 
18  5  4 
19  4  4 
20  3  4 

たとえば、最初の期間に4人のユニークユーザー(1,3,4,5)があり、そのうちの2人が2番目の期間にアクティブでした。したがって、保持率は0.5となる。第2の期間には3人のユニークユーザーがいて、そのうちの2人が第3の期間にアクティブだったため、保持率は0.666となります。次の期間にアクティブなユニークユーザーの割合をどのように見積もりますか?任意の提案をいただければ幸いです。

出力は次のようになります。

> output 
    period retention 
1  1  NA 
2  2  0.500 
3  3  0.666 
4  4  0.500 

testデータ:

> dput(test) 
structure(list(user_id = c(1, 5, 1, 3, 4, 2, 3, 2, 3, 1, 5, 5, 
2, 1, 4, 5, 5, 5, 4, 3), period = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 
2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4)), .Names = c("user_id", "period" 
), row.names = c(NA, -20L), class = "data.frame") 

答えて

0

これはとてもエレガントではありませんが、動作するようです。 dfがデータフレームであると仮定すると:

# make a list to hold unique IDS by 
uniques = list() 
for(i in 1:max(df$period)){ 
    uniques[[i]] = unique(df$user_id[df$period == i]) 
} 

# hold the retention rates 
retentions = rep(NA, times = max(df$period)) 

for(j in 2:max(df$period)){ 
    retentions[j] = mean(uniques[[j-1]] %in% uniques[[j]]) 
} 

基本的に%で%は、最初の引数の各要素は第二にあるか否かの論理を作成します。平均を取ると、私たちはその割合を得ます。

4

これはいかがですか?最初にユーザーを期間別に分割し、次に任意の2つの期間の間の割合のキャリーオーバーを計算する関数を作成し、分割リストでmapplyでループします。それはまた、summariseにいくつかの標準的な構文を使用してもここで

splt <- split(test$user_id, test$period) 

carryover <- function(x, y) { 
    length(unique(intersect(x, y)))/length(unique(x)) 
} 
mapply(carryover, splt[1:(length(splt) - 1)], splt[2:length(splt)]) 

     1   2   3 
0.5000000 0.6666667 0.5000000 
3

は、dplyrを使用しての試みです:

test %>% 
group_by(period) %>% 
summarise(retention=length(intersect(user_id,test$user_id[test$period==(period+1)]))/n_distinct(user_id)) %>% 
mutate(retention=lag(retention)) 

これが返されます。あなたが求める場合

period retention 
    <dbl>  <dbl> 
1  1  NA 
2  2 0.5000000 
3  3 0.6666667 
4  4 0.5000000 
+0

が、それは良いことではないだろうユニークなuser_idsの長さですか?ユーザーがある期間に2回出現した場合でも、1人の返信ユーザーとしてカウントされます。 –

+0

@giac_manデフォルトでは、 'intersect'は重複を削除します。そのため、操作が既に含まれているので' unique'を追加する必要はありません。 – Lamia

+0

ああ、そうだ。ありがとう –