按组统计各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
相关产品推荐
相关产品推荐

