计算R中的简单保留

the*_*ide 6 r dplyr retention

对于数据集test,我的目标是找出有多少独特用户在一个时期内从一个时期转移到下一个时期.

> 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
Run Code Online (Sandbox Code Playgroud)

例如,在第一个时期,有四个唯一用户(1,3,4和5),其中两个在第二个时期有效.因此保留率为0.5.在第二个时期,有三个独特的用户,其中两个在第三个时期有效,因此保留率为0.666,依此类推.如何找到下一期间活跃的唯一身份用户的百分比?任何建议,将不胜感激.

输出如下:

> output
  period retention
1      1        NA
2      2     0.500
3      3     0.666
4      4     0.500
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

sve*_*son 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]])
}
Run Code Online (Sandbox Code Playgroud)

基本上,%in% 创建一个逻辑,判断第一个参数的每个元素是否在第二个参数中。取平均值即可得出比例。