如何在R中将观测数据表转换为队列分析专用宽表?
在R中将观测数据表转换为队列分析宽表的方法
嘿,我来帮你搞定这个队列分析的宽表转换需求!你的目标是把访客的每日访问数据,转换成以**首次访问日期(Cohort日期)**为行,后续各天的访客留存数为列的宽表,对吧?我一步步给你拆解实现过程:
第一步:重现并预处理原始数据
首先先确认你的原始数据,然后先做去重——因为同一个访客同一天多次访问,在队列分析里我们只需要统计一次:
# 重现你的原始数据 myDF <- data.frame( Date = c("2018-01-01","2018-01-01","2018-01-01","2018-01-02","2018-01-02","2018-01-02","2018-01-03","2018-01-03"), `Visitor-ID` = c(1,2,3,2,3,2,2,3) ) # 去重:每个访客每天只保留一条记录 myDF_unique <- unique(myDF)
第二步:计算每个访客的首次访问日期(Cohort日期)
我们需要用每个访客的首次访问日期来分组,这里用dplyr包来处理会很方便:
library(dplyr) # 给每个访客标记他们的首次访问日期 cohort_data <- myDF_unique %>% group_by(`Visitor-ID`) %>% mutate(cohort_date = min(Date)) %>% ungroup()
第三步:计算访问日期与首次访问日期的天数差
接下来要把日期转换成日期格式,然后计算每次访问距离首次访问的天数(也就是day0、day1、day2...对应的数值):
# 转换日期格式并计算天数差 cohort_data <- cohort_data %>% mutate( Date = as.Date(Date), cohort_date = as.Date(cohort_date) ) %>% mutate(day_diff = as.integer(Date - cohort_date))
第四步:统计每个Cohort在各天的访客数
按Cohort日期和天数差分组,统计每组的访客数量:
# 统计每个Cohort在不同天数的访客数 cohort_counts <- cohort_data %>% group_by(cohort_date, day_diff) %>% summarise(visitors = n(), .groups = "drop")
第五步:转换为宽表格式
最后用tidyr包的pivot_wider函数把长表转成你想要的宽表,还可以把缺失值替换成0(如果需要的话):
library(tidyr) # 转成宽表并命名列 cohort_wide <- cohort_counts %>% pivot_wider( names_from = day_diff, values_from = visitors, names_prefix = "day " ) %>% # 把cohort_date重命名为Date,符合你的需求格式 rename(Date = cohort_date) # 可选:把NA替换为0(表示该天没有访客留存) cohort_wide <- cohort_wide %>% mutate(across(starts_with("day "), ~replace_na(., 0)))
最终结果
运行完上面的代码后,cohort_wide就是你想要的格式:
# A tibble: 2 × 4 Date `day 0` `day 1` `day 2` <date> <int> <int> <int> 1 2018-01-01 3 2 2 2 2018-01-02 2 2 0
完美匹配你给出的示例结果!
内容的提问来源于stack exchange,提问作者nexonvantec
相关产品推荐
相关产品推荐

