时间段 R 的条件和

Conditional sum for time period R

我有一大组数据,包括开始时间、停止时间和值。开始和停止时间因行而异,以 5 分钟为增量。我正在尝试创建一个新的数据框,该数据框具有 5 分钟的间隔以及间隔在行的开始和停止范围内的所有行的总和。

我有一个有效的脚本,但它使用 for 循环来计算间隔数据帧每一行的总和。

关于如何更快更有效地执行此操作的任何建议?目前可能需要很长时间才能到达 运行。

示例数据集 "data"

start           stop           Volume
7/1/2013 0:00   7/1/2013 1:00   10
7/1/2013 0:15   7/1/2013 1:00   5
7/1/2013 0:30   7/1/2013 0:40   3
7/1/2013 0:50   7/1/2013 0:55   1

示例输出 名为 "sum_mw"

的数据框
IntervalStart   IntervalEnd     Sum_Volume
7/1/2013 0:00   7/1/2013 0:05   10.00 
7/1/2013 0:05   7/1/2013 0:10   10.00 
7/1/2013 0:10   7/1/2013 0:15   10.00 
7/1/2013 0:15   7/1/2013 0:20   15.00 
7/1/2013 0:20   7/1/2013 0:25   15.00 
7/1/2013 0:25   7/1/2013 0:30   15.00 
7/1/2013 0:30   7/1/2013 0:35   18.00 
7/1/2013 0:35   7/1/2013 0:40   18.00 
7/1/2013 0:40   7/1/2013 0:45   15.00 
7/1/2013 0:45   7/1/2013 0:50   15.00 
7/1/2013 0:50   7/1/2013 0:55   16.00 
7/1/2013 0:55   7/1/2013 1:00   15.00 

这是我使用的示例代码。

   library(lubridate)

    data$start<-mdy_hm(data$start,tz="UTC")
    data$stop<-mdy_hm(data$stop,tz="UTC")

    sum_mw$IntervalStart<-mdy_hm(sum_mw$IntervalStart,tz="UTC")
    sum_mw$IntervalEnd<-mdy_hm(sum_mw$IntervalEnd,tz="UTC")

    sum_mw$Sum_Volume<-0

    for (i in 1:nrow(sum_mw))
    {
    sum_mw$Sum_Volume[i] <- sum(data[data$start<=sum_mw$IntervalStart[i] & data$stop>=sum_mw$IntervalEnd[i],][,3],na.rm=T)
    }

这是 tidyverse 中的一个选项。将列转换为 DateTime class 后,使用 map2 循环相应的 'start',停止' 值,得到 seqby 5 minute间隔,unnestlist列,按'Interval'分组,得到'Volume'

sum
library(tidyverse)
library(lubridate)
df1 %>% 
   mutate_at(1:2, mdy_hm) %>% 
   transmute(Interval = map2(start, stop, seq, by = '5 min'), Volume) %>% 
   unnest(Interval) %>% 
   group_by(Interval) %>% 
   summarise(Sum_Volume = sum(Volume))

数据

df1 <- structure(list(start = c("7/1/2013 0:00", "7/1/2013 0:15", "7/1/2013 0:30", 
"7/1/2013 0:50"), stop = c("7/1/2013 1:00", "7/1/2013 1:00", 
"7/1/2013 0:40", "7/1/2013 0:55"), Volume = c(10L, 5L, 3L, 1L
)), class = "data.frame", row.names = c(NA, -4L))