【问题标题】:Conditional sum for time period R时间段 R 的条件总和
【发布时间】:2020-01-19 20:29:35
【问题描述】:

我有大量数据,其中包括开始时间、停止时间和值。开始和停止时间因行而异,以 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)
    }

【问题讨论】:

  • 你可能可以在 data.table 中使用滚动连接,但我的使用有点生疏:/

标签: r dplyr lubridate


【解决方案1】:

这是tidyverse 中的一个选项。将列转换为 DateTime 类后,使用map2 循环遍历相应的“开始”、“停止”值,得到sequence 次by5 minute 间隔、unnestlist 列,按“间隔”分组,得到“音量”的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))

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多