Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何计算每日保留率?_R - Fatal编程技术网

R 如何计算每日保留率?

R 如何计算每日保留率?,r,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

我是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”每天的保留率。该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

oct1不喜欢for循环,因此我建议使用
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
库(dplyr)
图书馆(lubridate)
数据=读取。表格(text=“id日期
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")
##将日期列更新为日期对象
数据$date=ymd(数据$date)
展开.grid(date1=unique(data$date),##创建日期之间的所有组合
date2=唯一(数据$date))%>%
筛选(date1%##仅保留第二个日期在第一个日期之后的情况
分组依据(日期1,日期2)%>%###针对每个日期组合
do({ids_1=setdiff(unique(data[data$date==ymd(.$date1),]$id),##在date1中获取新id(它们在这个日期第一次出现)
唯一(数据[数据$date%##计算百分比
解组()
#日期1日期2中华人民共和国
#(时间)(时间)(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

不喜欢for循环,因此我建议使用
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
库(dplyr)
图书馆(lubridate)
数据=读取。表格(text=“id日期
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")
##将日期列更新为日期对象
数据$date=ymd(数据$date)
展开.grid(date1=unique(data$date),##创建日期之间的所有组合
date2=唯一(数据$date))%>%
筛选(date1%##仅保留第二个日期在第一个日期之后的情况
分组依据(日期1,日期2)%>%###针对每个日期组合
do({ids_1=setdiff(unique(data[data$date==ymd(.$date1),]$id),##在date1中获取新id(它们在这个日期第一次出现)
唯一(数据[数据$date%##计算百分比
解组()
#日期1日期2中华人民共和国
#(时间)(时间)(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

非常感谢~ dplyr的软件包非常有用。实际上我的时间数据格式是yyyy-mm-dd,我知道你先把yyyy/mm/dd改成yyyy-mm-dd。我不知道如何在这个问题上做出改变。do({dt1=data[data$date==ymd(.$date1),])似乎不适用于yyyy-mm-dd格式。是否可以执行
dput(数据)
并将输出张贴在此处,这样我就可以看到您的格式了。我做出来了,但我的数据太长,只显示了10行。您能告诉我如何在控制台中看到结果,或者如何保存结果吗?前10行足以看到格式。只要在运行命令
dput在你的问题下。应该是类似于
结构(列表(………..
所以第一天