对于数据集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")
答案 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%会创建第一个参数的每个元素是否在第二个参数中的逻辑。采取均值给出了我们的比例。