如何用tbl_period的区间信息统计tbl_activity各时段的活动数量与平均强度
R双tibble时段匹配统计实现方案
现有两个tibble结构如下:
tbl_period:存储各时段的id、名称、开始与结束时间,其中时段名称存在重复tbl_activity:存储每条活动记录的发生时间、强度值
需求为tbl_period新增两列,分别统计每个时段范围内的活动总条数、活动强度平均值,需按id, period分组避免重名时段统计错误。
实现代码
基于你提供的示例数据,可直接使用以下代码完成统计:
library(tidyverse) # 核心统计逻辑 tbl_period_with_stat <- tbl_period %>% # 按要求用id+period分组,避免重名时段混淆 group_by(id, period) %>% mutate( # 统计当前时段内的活动总条数 activity_total = sum(tbl_activity$time >= start & tbl_activity$time <= end), # 统计当前时段内的活动强度平均值,无匹配活动时返回NA avg_intensity = mean(tbl_activity$intensity[tbl_activity$time >= start & tbl_activity$time <= end]) ) %>% ungroup() # 查看结果 head(tbl_period_with_stat)
可选优化写法
如果数据量较大,也可以用非等值连接的方式提升性能:
tbl_period_with_stat <- tbl_period %>% left_join(tbl_activity, join_by(between(y$time, x$start, x$end))) %>% group_by(id, period) %>% summarise( activity_total = n(), avg_intensity = mean(intensity, na.rm = TRUE), start = first(start), end = first(end), .groups = "drop" )
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

