时间段 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',停止' 值,得到 seq
次 by
5 min
ute间隔,unnest
list
列,按'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))
我有一大组数据,包括开始时间、停止时间和值。开始和停止时间因行而异,以 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',停止' 值,得到 seq
次 by
5 min
ute间隔,unnest
list
列,按'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))