计算R中的简单保留

时间:2017-05-19 20:46:24

标签: 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

例如,在第一个时期,有四个唯一用户(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

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")

3 个答案:

答案 0 :(得分:4)

这个怎么样?首先按期间拆分用户,然后编写一个计算任意两个期间之间的结转比例的函数,然后使用mapply将其循环通过拆分列表。

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 

答案 1 :(得分:4)

以下是使用summarise的尝试,但它也使用了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

返回:

{{1}}

答案 2 :(得分: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]])
}

基本上%in%会创建第一个参数的每个元素是否在第二个参数中的逻辑。采取均值给出了我们的比例。