使用slide_dfr在R中汇总一小时时间窗口数据时的问题求助
使用slide_dfr在R中汇总一小时时间窗口数据时的问题求助
我在R中有一个数据框,包含时间戳(time,这里日期无关,只需要时间部分)和对应的值(E),时间戳代表一天中的特定时刻,E代表该时刻的条目数。我的目标是找到E总和最大的一小时时间窗口,并获取这个窗口的开始和结束时间。
以下是我的示例数据:
library(tidyverse) time <- c("1899-12-31 08:07:18 UTC", "1899-12-31 08:17:18 UTC", "1899-12-31 08:27:33 UTC", "1899-12-31 08:57:28 UTC", "1899-12-31 09:07:18 UTC", "1899-12-31 09:17:18 UTC", "1899-12-31 09:27:19 UTC", "1899-12-31 09:57:52 UTC", "1899-12-31 10:07:18 UTC", "1899-12-31 10:17:42 UTC", "1899-12-31 11:37:42 UTC", "1899-12-31 11:47:35 UTC", "1899-12-31 11:57:20 UTC", "1899-12-31 12:07:37 UTC", "1899-12-31 12:17:18 UTC", "1899-12-31 12:27:18 UTC", "1899-12-31 13:37:44 UTC", "1899-12-31 13:47:29 UTC", "1899-12-31 13:57:08 UTC", "1899-12-31 14:07:00 UTC", "1899-12-31 14:57:27 UTC", "1899-12-31 15:07:18 UTC", "1899-12-31 15:37:15 UTC", "1899-12-31 15:47:18 UTC") E <- c(1, 5, 3, 8, 7, 2, 7, 1, 3, 8, 4, 9, 10, 7, 2, 3, 6, 9, 8, 11, 5, 2, 3, 2) df <- tibble(time, E) %>% mutate(time = as.POSIXct(time))
我尝试使用slider包的slide_dfr函数来实现这个需求,具体代码如下:
library(slider) # 定义汇总函数 calculate_one_hour <- function(data) { print(paste("Number of rows in window:", nrow(data))) data <- data %>% drop_na(E, time) tibble( start_time = min(data$time, na.rm = TRUE), end_time = max(data$time, na.rm = TRUE), sum = sum(data$E, na.rm = TRUE) ) } # 计算一天中时间对应的最小/最大秒数 min_time <- min(hour(df$time) * 3600 + minute(df$time) * 60 + second(df$time)) max_time <- max(hour(df$time) * 3600 + minute(df$time) * 60 + second(df$time)) # 生成最小到最大秒数的序列 all_seconds <- tibble( seconds = seq(from = min_time, to = max_time, by = 1) ) # 合并原始数据和秒数序列 df <- df %>% mutate(seconds = as.integer(hour(time) * 3600 + minute(time) * 60 + second(time))) %>% right_join(all_seconds, by = "seconds") # 滑动窗口计算 result <- df %>% arrange(seconds) %>% slide_dfr(.x = ., .i = all_seconds, .f = ~ calculate_one_hour(.x), .width = 3600) # 找出总和最大的窗口 max_hour <- result %>% filter(sum == max(sum))
但现在遇到了问题:
- 输出的
result数据框行数和原始数据框一致,且所有行的start_time、end_time和sum值完全相同 - 我在
calculate_one_hour函数中打印了每个窗口的行数,结果都是1,这显然不对——我需要每个窗口包含对应一小时内的所有数据
有没有人能帮我理解为什么slide_dfr没有按预期工作?或者给我一些修改代码的建议,让我能实现找到E总和最大的一小时窗口的目标?非常感谢!
备注:内容来源于stack exchange,提问作者Rory
相关产品推荐
相关产品推荐

