基于R语言计算用户入职后13周内的登录事件次数
统计用户入职13周内的登录事件次数
你之前报错的核心原因是误用了sum处理POSIXct类型数据——我们需要的是计数符合时间范围的登录事件行数,而非对时间值求和。以下是两种简洁的dplyr实现方案:
前置准备
确保已加载必要的包:
library(dplyr) library(lubridate) # 用于便捷处理日期时间,可选(不用的话可替换`days(91)`为整数91)
方案1:先过滤再分组计数
先筛选出每个用户入职后91天内的登录记录,再按用户分组统计次数:
login_counts <- log_df %>% # 将入职日期转换为POSIXct,与raised_at类型统一,同时计算91天后的截止时间 mutate( onboarding_posix = as.POSIXct(onboarding_date), period_end = onboarding_posix + days(91) ) %>% # 过滤登录时间在入职日到截止日之间的记录 filter(raised_at >= onboarding_posix, raised_at <= period_end) %>% # 按用户分组,统计登录次数 group_by(case_number) %>% summarize(login_count = n())
方案2:分组后直接条件计数
无需提前过滤,直接在分组统计阶段判断每条记录是否符合时间范围:
login_counts <- log_df %>% group_by(case_number, onboarding_date) %>% summarize( login_count = sum( # 逻辑条件:登录时间在入职日及之后,且入职91天内 raised_at >= as.POSIXct(onboarding_date) & raised_at <= as.POSIXct(onboarding_date + days(91)), na.rm = TRUE # 处理可能的NA值 ), .groups = "drop" # 取消分组状态 )
补充:保留所有用户(含无登录记录的用户)
如果需要统计所有用户(包括入职后无登录的用户,计数为0),可结合right_join补全:
# 假设存在包含所有用户的user_df(至少有case_number和onboarding_date列) login_counts_all <- log_df %>% group_by(case_number, onboarding_date) %>% summarize( login_count = sum( raised_at >= as.POSIXct(onboarding_date) & raised_at <= as.POSIXct(onboarding_date + days(91)), na.rm = TRUE ), .groups = "drop" ) %>% right_join(user_df %>% select(case_number, onboarding_date), by = c("case_number", "onboarding_date")) %>% mutate(login_count = replace_na(login_count, 0))
内容的提问来源于stack exchange,提问作者RebeccA
相关产品推荐
相关产品推荐

