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

按组统计各Date2日期前对应Date1数量的技术实现问询

解决方案

先把原始数据标准化为R可处理的格式:

# 构建包含Date1和Group的数据框
df <- data.frame(
  Date1 = as.Date(c("2023-05-17", "2023-06-23")),
  Group = c(1, 2)
)

# 将Date2转换为日期格式
Date2 <- as.Date(c("2023-05-31", "2023-06-30", "2023-07-31"))

方法1:用tidyverse工具链实现

library(dplyr)
library(tidyr)

# 生成所有分组与Date2日期的组合,再统计符合条件的记录数
result <- expand_grid(Group = unique(df$Group), Date2 = Date2) %>%
  left_join(df, by = "Group") %>%
  group_by(Group, Date2) %>%
  summarise(count = sum(Date1 < Date2, na.rm = TRUE)) %>%
  ungroup()

print(result)

运行后输出结果:

# A tibble: 6 × 3
  Group Date2      count
  <dbl> <date>     <int>
1     1 2023-05-31     1
2     1 2023-06-30     1
3     1 2023-07-31     1
4     2 2023-05-31     0
5     2 2023-06-30     1
6     2 2023-07-31     1

方法2:基础R实现(无第三方包依赖)

# 获取所有唯一分组
groups <- unique(df$Group)
# 初始化结果矩阵
result_matrix <- matrix(nrow = length(groups), ncol = length(Date2), 
                        dimnames = list(groups, Date2))

# 遍历分组与日期,统计符合条件的记录数
for(g in groups) {
  group_dates <- df$Date1[df$Group == g]
  for(d in seq_along(Date2)) {
    result_matrix[as.character(g), as.character(Date2[d])] <- sum(group_dates < Date2[d])
  }
}

# 转换为易读的数据框格式
result_df <- as.data.frame(result_matrix) %>%
  tibble::rownames_to_column("Group") %>%
  tidyr::pivot_longer(cols = -Group, names_to = "Date2", values_to = "count") %>%
  mutate(Date2 = as.Date(Date2))

print(result_df)

输出结果与方法1完全一致。

逻辑说明

核心是先生成每个分组+每个Date2日期的全组合,再对每个组合统计该分组中Date1早于当前Date2的记录数量——sum(Date1 < Date2)会自动将符合条件的记录转为1、不符合的转为0,求和后即得到目标总数。

内容的提问来源于stack exchange,提问作者biostat_help

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:25:56