我有大量数据,包括开始时间、停止时间和值。开始和停止时间因行而异,以 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
样本输出
名为“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 类后,使用 map2
循环遍历相应的“开始”、“停止”值,得到 seq
时代脉搏by
5 min
ute 间隔,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))
关于r - 时间段 R 的条件总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58000268/