R中如何按时间分组将上午下午访问统计拆分为独立列
时段访问计数独立列拆分实现方案
你当前生成的d3是按分组拆分的长格式数据:每一行对应「单个box、单个day下单个时段(上午/下午)」的统计值,要拆分为同一box、day下的多列统计值,直接用你现有tidyverse体系的长转宽工具即可,无需引入新包。
具体实现步骤(适配你现有代码)
- 先确认时段标记逻辑正确生成
你已定义time <=57为上午,先基于原始数据集补全逻辑标记:# 给原始数据集d生成时段标记,TRUE=上午,FALSE=下午 d$morning <- d$time <= 57 - 优化聚合逻辑(避免分组残留报错)
你原有summarise_at(vars("visit"), sum)的写法可正常运行,可微调为更稳妥的写法,同时避免后续操作受分组状态影响:d3 <- d %>% group_by(box, day, morning) %>% # 直接指定统计字段,重命名为更清晰的visit_total summarise(visit_total = sum(visit), .groups = "drop") - 动态计算对应时段的占比(frac)
你原有写死除以57的逻辑可适配不同时段的基准:如果上午基准时长为57、下午基准时长为对应时段的总时间长度,可按如下写法生成占比;如果暂时沿用原有逻辑可直接保留d3$frac <- d3$visit_total /57# 示例:假设下午时段的基准时长为87(可根据你的实际time范围调整) d3$frac <- ifelse(d3$morning, d3$visit_total / 57, d3$visit_total / 87) - 核心拆分列操作(长表转宽表)
用pivot_wider()按box、day合并行,把不同时段的统计值拆为独立列:d_final <- d3 %>% pivot_wider( id_cols = c(box, day), # 以box、day为唯一行标识,同一组合并为1行 names_from = morning, # 用时段的取值作为列名的区分标识 values_from = c(visit_total, frac), # 需要拆分的两个统计值 values_fill = 0 # (可选)如果某box+day下缺失某时段的观测,自动填充0避免出现NA ) - (可选)修改列名提升可读性
默认生成的列名会是visit_total_TRUE、visit_total_FALSE、frac_TRUE、frac_FALSE,可批量重命名为更易懂的名称:colnames(d_final) <- c("box", "day", "上午访问总和", "下午访问总和", "上午访问占比", "下午访问占比")
最终效果
生成的d_final每一行对应唯一的box+day组合,上午、下午的访问计数、占比都存于独立列,完全匹配你的需求。
注意:如果某组的时段标记未生成(比如原始数据里的
morning列有缺失值),可以先运行d <- d %>% filter(!is.na(morning))过滤掉无效行再聚合。
内容的提问来源于stack exchange,提问作者researchstudent
相关产品推荐
相关产品推荐

