如何聚合同一时间窗口内的数据?R语言tidy数据整理方案
解决方法
你的问题出在spread函数只会对每行存在的tier值填充,其他行对应列自然为空。要实现将ortho的值填充到其时间窗口内的所有行,可按以下步骤操作:
方法1:先提取ortho信息再合并
library(tidyverse) # 提取ortho层级的时间范围和对应值 ortho_detail <- dfgs_final %>% filter(tier == "ortho") %>% select(ortho = value, ortho_start = begin_ms, ortho_end = end_ms) # 转换宽格式并关联ortho信息 target_df <- dfgs_final %>% spread(key = tier, value = value) %>% cross_join(ortho_detail) %>% # 筛选时间落在ortho窗口内的行(原数据所有行都满足) filter(begin_ms >= ortho_start & end_ms <= ortho_end) %>% # 调整列顺序并移除临时列 select(ortho, begin_ms, end_ms, words, metric, reaction)
方法2:先添加ortho列再转宽格式
library(tidyverse) # 提取ortho的核心信息 ortho_value <- dfgs_final$value[dfgs_final$tier == "ortho"] ortho_start <- dfgs_final$begin_ms[dfgs_final$tier == "ortho"] ortho_end <- dfgs_final$end_ms[dfgs_final$tier == "ortho"] # 预处理数据并转换格式 target_df <- dfgs_final %>% # 给符合时间范围的行标记ortho值 mutate(ortho = ifelse(begin_ms >= ortho_start & end_ms <= ortho_end, ortho_value, NA)) %>% spread(key = tier, value = value) %>% # 填充ortho列的空值 mutate(ortho = replace_na(ortho, ortho_value)) %>% select(ortho, begin_ms, end_ms, words, metric, reaction)
运行上述任意一种代码,都能得到你期望的目标DataFrame结构。
内容的提问来源于stack exchange,提问作者cambar
相关产品推荐
相关产品推荐

