[英]Conditional sum for time period R
我有一大組數據,包括開始時間、停止時間和值。 開始和停止時間因行而異,以 5 分鍾為增量。 我正在嘗試創建一個具有 5 分鍾間隔的新數據框,以及該間隔在一行的開始和停止范圍內的所有行的總和。
我有一個可以工作的腳本,但它使用了一個 for 循環來計算我的間隔數據幀的每一行的總和。
關於如何更快更有效地做到這一點的任何建議? 目前可能需要很長時間才能運行。
樣本數據集“數據”
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
示例 Output 數據幀名為“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 seq
后,使用map2
循環對應的“開始”、“停止”值, by
5 min
的間隔獲取時間序列,取消unnest
list
列,按“間隔”分組,得到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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.