如何计算每日保留率?

时间:2015-11-06 04:27:07

标签: r

我是R.的新手。这是我的数据:

data
   id      date
1   1 2015/10/1
2   2 2015/10/1
3   3 2015/10/1
4   4 2015/10/1
5   5 2015/10/1
6   1 2015/10/2
7   3 2015/10/2
8   4 2015/10/2
9   6 2015/10/2
10  7 2015/10/2
11  1 2015/10/3
12  7 2015/10/3
13  3 2015/10/3
14  9 2015/10/3
15  1 2015/10/4
16 10 2015/10/4
17 11 2015/10/4

我想计算“id”的每一天的保留率。身份证可能每天都是新的或重复的。我希望每天都将其视为初始日期,然后查找下一天的保留率。

到目前为止,我已经尝试过......

oct1<-data[which(data$date =="2015/10/1"),]
oct2<-data[which(data$date == "2015/10/2"),]
oct3<-data[which(data$date == "2015/10/3"),]
oct4<-data[which(data$date == "2015/10/4"),]

union_a1<-oct1$id[which(oct1$id%in%oct2$id)]
union_a2<- oct1$id[which(oct1$id%in%oct3$id)]
union_a3<- oct1$id[which(oct1$id%in%oct4$id)]

per_a1=length(union_a1)/length(oct1$id)
per_a2=length(union_a2)/length(oct1$id)
per_a2=length(union_a3)/length(oct1$id)

union_b1<-oct2$id[which(oct2$id%in%oct3$id)]
union_b2<-oct2$id[which(oct2$id%in%oct4$id)]

per_b1<-length(union_b1)/length(oct2$id)
per_b2<- length(union_b2)/length(oct2$id)

union_c1<-oct3$id[which(oct3$id%in%oct4$id)]
per_c1<-length(union_c1)/length(oct3$id)
per_a1
# [1] 0.6
per_a2
# [1] 0.4
per_a3
# [1] 0.2
per_b1
# [1] 0.6
per_b2
# [1] 0.2
per_c1
# [1] 0.25

有人可以帮我写一个for循环来解决这个问题吗?我认为for循环很容易计算每一天。

1 个答案:

答案 0 :(得分:0)

不是for-loops的粉丝,所以我建议使用dplyr(数据操作)和lubridate(处理日期)的替代方法。 此过程使用分组和所有可能的感兴趣的日期组合来替换for循环。请注意,我在考虑您在下面的评论中提到的内容:您希望根据特定日期的新用户查找保留率。

library(dplyr)
library(lubridate)

data = read.table(text="   id      date
                  1   1 2015/10/1
                  2   2 2015/10/1
                  3   3 2015/10/1
                  4   4 2015/10/1
                  5   5 2015/10/1
                  6   1 2015/10/2
                  7   3 2015/10/2
                  8   4 2015/10/2
                  9   6 2015/10/2
                  10  7 2015/10/2
                  11  1 2015/10/3
                  12  7 2015/10/3
                  13  3 2015/10/3
                  14  9 2015/10/3
                  15  1 2015/10/4
                  16 10 2015/10/4
                  17 11 2015/10/4")

## update your date column to date object 
data$date = ymd(data$date)


expand.grid(date1 = unique(data$date),                             ## create all combinations between dates
            date2 = unique(data$date)) %>%
  filter(date1 < date2) %>%                                        ## keep only cases where 2nd date is after 1st date
  group_by(date1, date2) %>%                                       ## for each combination of dates
  do({ids_1 = setdiff(unique(data[data$date == ymd(.$date1),]$id), ## get new ids in date1 (they showed up first time at this date)
                      unique(data[data$date < ymd(.$date1),]$id))           
  N_ids_1 = length(ids_1)                                          ## count how many ids you have
  ids_2 = unique(data[data$date == ymd(.$date2),]$id)              ## get ids from date2
  N_ids_2 = length(intersect(ids_2, ids_1))                        ## count how many ids exist in previous dataset
  data.frame(Prc = N_ids_2/N_ids_1)}) %>%                          ## calculate the percentage          
  ungroup()

#        date1      date2   Prc
#       (time)     (time) (dbl)
# 1 2015-10-01 2015-10-02   0.6
# 2 2015-10-01 2015-10-03   0.4
# 3 2015-10-01 2015-10-04   0.2
# 4 2015-10-02 2015-10-03   0.5
# 5 2015-10-02 2015-10-04   0.0
# 6 2015-10-03 2015-10-04   0.0