R 如何计算每日保留率?
我是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
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在你的问题下。应该是类似于结构(列表(………..
所以第一天