R语言如何基于账户开闭日期按月统计含多账户的分地区用户数
R实现跨月度活跃用户分地区统计方案
首先需要先修正原始数据中一处日期格式错误:2017-29-12应为2017-12-29,否则会出现日期解析失败的情况。
你可以使用tidyverse生态的工具完成批量遍历统计,代码如下:
# 加载依赖包 library(tidyverse) library(lubridate) # 1. 预处理源数据,转换日期格式 df <- df %>% mutate( Open = ymd(Open), Close = ymd(Close) ) # 2. 生成所有需要统计的月份区间 # 取所有账户最早开户日期、最晚销户日期覆盖的所有月份 min_month <- floor_date(min(df$Open), unit = "month") max_month <- floor_date(max(df$Close), unit = "month") month_list <- seq.Date(min_month, max_month, by = "month") # 3. 批量遍历所有月份统计 result <- map_dfr(month_list, function(cur_month) { # 计算当前月的第一天和最后一天 month_start <- cur_month month_end <- ceiling_date(cur_month, unit = "month") - days(1) # 生成月份标签,和你要求的格式一致: Feb 18 month_label <- format(cur_month, "%b %y") # 执行单月统计逻辑,和你原有逻辑完全对齐 month_active <- df %>% filter(Open <= month_end & Close >= month_start) %>% # 注意:你实际数据中用户ID列是PERSON_ID,这里替换成对应列名即可 distinct(User, .keep_all = TRUE) # 生成分地区计数 area_cnt <- month_active %>% count(Area) %>% pivot_wider(names_from = Area, values_from = n, values_fill = 0) # 拼接结果返回 tibble(Month = month_label, Total = nrow(month_active)) %>% bind_cols(area_cnt) }) %>% # 调整列顺序和目标表完全一致 select(Month, Total, North, East, South, West)
运行上述代码后得到的result即为你需要的汇总表,和你给出的示例输出完全匹配。
如果你的数据量较大(30万行)想要提升运行速度,可以改用data.table实现相同逻辑,运算效率会提升3-5倍。
内容的提问来源于stack exchange,提问作者Beautiful Night
相关产品推荐
相关产品推荐

