基于日期范围按唯一用户ID计算R中变量的条件求和
解决方案
这里给你两种适合新手的实现方式,都能完成需求:
方法一:用Base R实现
- 先把两个数据框按
dash_ID合并,让每条收听记录对应上用户的里程碑日期:
merged_df <- merge(DF1, DF2, by = "dash_ID")
- 筛选出符合日期范围的记录:
date在Intervention.End.Date之后、Follow.up.End.Date及之前
filtered_df <- subset(merged_df, date >= Intervention.End.Date & date <= Follow.up.End.Date)
- 按
dash_ID分组,计算每个用户的总收听时长:
total_time <- aggregate(time_elapsed_min ~ dash_ID, data = filtered_df, sum)
- 把求和结果合并回原DF2,无符合条件记录的用户自动填充0:
DF2$total_listen_time <- merge(DF2, total_time, by = "dash_ID", all.x = TRUE)$time_elapsed_min DF2$total_listen_time <- replace(DF2$total_listen_time, is.na(DF2$total_listen_time), 0)
方法二:用tidyverse工具包(更直观,适合新手)
如果还没安装tidyverse,先完成安装加载:
install.packages("tidyverse") library(tidyverse)
然后按流程操作:
- 关联两个数据框,筛选日期范围后分组求和:
total_time_df <- DF1 %>% left_join(DF2, by = "dash_ID") %>% filter(date >= Intervention.End.Date, date <= Follow.up.End.Date) %>% group_by(dash_ID) %>% summarise(total_listen_time = sum(time_elapsed_min, na.rm = TRUE))
- 把求和结果合并回DF2,缺省值补0:
DF2 <- DF2 %>% left_join(total_time_df, by = "dash_ID") %>% mutate(total_listen_time = replace_na(total_listen_time, 0))
注意点
- 你已经把所有日期转成
Date类,直接用>=和<=做日期比较是完全可行的 - 两种方法都会把无有效收听记录的用户总时长设为0,符合常规统计逻辑
内容的提问来源于stack exchange,提问作者wangki
相关产品推荐
相关产品推荐

