R语言 按分钟计数观察

evrscar2  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(135)

我试着计算一天中每分钟有多少辆汽车在路上行驶。我的日期范围是一整月,我的数据包括每辆车的开始时间和结束时间。
我将绘制一天中交通流量最大的时段,即09:42有19辆汽车在路上,而11:21有11辆车在路上。
可能有一种方法可以用dplyr来实现这一点,但我不熟悉那个包。这个程序目前在sas中运行,但需要在r中重写。
我目前的解决方案使用了一系列嵌套的for循环,唯一的问题是这些循环需要将近一个小时来计算,因为有超过86,000行的数据。
我有POSIX变量,开始和结束时间如下:

StartTime           EndTime             TypeOfCar
1   2019-07-01 12:00:00 2019-07-01 18:14:00 32S
2   2019-07-01 15:00:00 2019-07-01 20:47:00 32S
3   2019-07-01 16:29:00 2019-07-01 22:24:00 32S
4   2019-07-01 18:00:00 2019-07-01 23:46:00 32S
5   2019-07-01 13:12:00 2019-07-01 14:57:00 32S
6   2019-07-02 04:30:00 2019-07-02 10:05:00 32S
7   2019-07-01 20:10:00 2019-07-01 22:32:00 737
8   2019-07-02 06:40:00 2019-07-02 12:05:00 32S
9   2019-07-02 02:10:00 2019-07-02 07:43:00 32S

我正在寻找一个类似的输出:

12:01AM - 5 cars
12:02AM - 5 cars
12:03AM - 4 cars
...
...
...
09:42AM - 16 cars
...
11:48AM - 21 cars
...
...
5:12PM - 32 cars
...
10:59PM - 0 cars
11:00PM - 0 cars

一个重要的注意事项是,我想一天中没有任何流量的时间也.总的来说,我想看到所有计数1440分钟在一天中.目标是生成一个类似于下面的图:

ttygqcqt

ttygqcqt1#

library(dplyr)
library(tidyr)
library(lubridate)

df1 %>% 
  rowwise %>% 
  transmute(intervals = list(seq.POSIXt(floor_date(StartTime, unit = "min"), 
                                        ceiling_date(EndTime, unit = "min"), 
                                        by = "min"))) %>% 
  unnest %>% 
  group_by(intervals) %>% 
  count
#> # A tibble: 1,303 x 2
#> # Groups:   intervals [1,303]
#>    intervals               n
#>    <dttm>              <int>
#>  1 2019-07-01 12:00:00     1
#>  2 2019-07-01 12:01:00     1
#>  3 2019-07-01 12:02:00     1
#>  4 2019-07-01 12:03:00     1
#>  5 2019-07-01 12:04:00     1
#>  6 2019-07-01 12:05:00     1
#>  7 2019-07-01 12:06:00     1
#>  8 2019-07-01 12:07:00     1
#>  9 2019-07-01 12:08:00     1
#> 10 2019-07-01 12:09:00     1
#> # ... with 1,293 more rows

数据:

read.table(text="    StartTime           EndTime             TypeOfCar
                  1   2019-07-01_12:00:00 2019-07-01_18:14:00 32S
                  2   2019-07-01_15:00:00 2019-07-01_20:47:00 32S
                  3   2019-07-01_16:29:00 2019-07-01_22:24:00 32S
                  4   2019-07-01_18:00:00 2019-07-01_23:46:00 32S
                  5   2019-07-01_13:12:00 2019-07-01_14:57:00 32S
                  6   2019-07-02_04:30:00 2019-07-02_10:05:00 32S
                  7   2019-07-01_20:10:00 2019-07-01_22:32:00 737
                  8   2019-07-02_06:40:00 2019-07-02_12:05:00 32S
                  9   2019-07-02_02:10:00 2019-07-02_07:43:00 32S", 
                       header=T,
                       stringsAsFactors = F) -> df1

df1$StartTime <- as.POSIXct(df1$StartTime, format = "%Y-%m-%d_%H:%M:%S", tz="EST")
df1$EndTime <- as.POSIXct(df1$EndTime, format = "%Y-%m-%d_%H:%M:%S", tz="EST")
gk7wooem

gk7wooem2#

我们可以在每个StartTimeEndTimecount之间创建一个持续时间为1分钟的序列。

library(dplyr)
library(tidyr)

df %>%
  unnest(time = purrr::map2(StartTime, EndTime, seq, by = "1 min")) %>%
  select(-StartTime, -EndTime) %>%
  count(time) %>%
  arrange(desc(n))

# A tibble: 1,303 x 2
#   time                    n
#   <dttm>              <int>
# 1 2019-07-01 18:00:00     4
# 2 2019-07-01 18:01:00     4
# 3 2019-07-01 18:02:00     4
# 4 2019-07-01 18:03:00     4
# 5 2019-07-01 18:04:00     4
# 6 2019-07-01 18:05:00     4
# 7 2019-07-01 18:06:00     4
# 8 2019-07-01 18:07:00     4
# 9 2019-07-01 18:08:00     4
#10 2019-07-01 18:09:00     4
# … with 1,293 more rows

数据

df <- structure(list(StartTime = structure(c(1561982400, 1561993200, 
1561998540, 1562004000, 1561986720, 1562041800, 1562011800, 1562049600, 
1562033400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
EndTime = structure(c(1562004840, 1562014020, 1562019840, 
1562024760, 1561993020, 1562061900, 1562020320, 1562069100, 
1562053380), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
TypeOfCar = c("32S", "32S", "32S", "32S", "32S", "32S", "737", 
"32S", "32S")), row.names = c("1", "2", "3", "4", "5", "6", 
"7", "8", "9"), class = "data.frame")

相关问题