Условная сумма за период времени R - PullRequest
4 голосов
/ 18 сентября 2019

У меня есть большой набор данных, который включает время начала, время остановки и значение.Время начала и окончания варьируется от строки к строке и с шагом 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)
    }

1 Ответ

0 голосов
/ 18 сентября 2019

здесь опция в tidyverse.После преобразования столбцов в класс DateTime используйте map2 для циклического перебора соответствующих значений 'start', stop ', получите seq интервал времени by 5 min интервал использования, unnest столбец list, сгруппированные по 'Interval', получают sum из 'Volume'

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))

data

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))
...