You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:00:03