如何按时间间隔和列值对R数据框进行分组?

4

我有一个数据集,其中包含特定设施发生事件的时间列表:

> head(facility_events);
facility_id          event_time
1   20248 2018-01-01 00:00:01
2   12445 2018-01-01 00:00:04
3   20248 2018-01-01 00:00:08
4   17567 2018-01-01 00:00:47
5   17567 2018-01-01 00:03:50
6   10459 2018-01-01 00:04:01

我希望生成一个数据框,通过按设施分组以及将事件分成3分钟间隔来进行聚合求和。输出结果大致如下:
count facility interval
2      20248   0 
1      12445   0
1      17567   0
1      17567   1
1      10459   1

你如何在R中完成这个任务?

在你的问题中添加dput(head(facility_events))的输出,这样输入数据集就可以被复制。 - Santosh M.
2个回答

7
您可以使用 lubridate 加上 tidyverse 来实现此功能:
df <- data.frame(facility_id = c(20248, 12445, 20248, 17567, 17567, 10459),
                 event_time = as.POSIXct(c("2018-01-01 00:00:01", "2018-01-01 00:00:04", "2018-01-01 00:00:08", "2018-01-01 00:00:47", "2018-01-01 00:03:50", "2018-01-01 00:04:01")))

library(tidyverse)

df %>%
    mutate(interval = lubridate::minute(event_time) %/% 3) %>%
    group_by(facility_id, interval) %>%
    summarise(count = n())

# A tibble: 5 x 3
# Groups: facility_id [?]
  facility_id interval count
        <dbl>    <int> <int>
1       10459        1     1
2       12445        0     1
3       17567        0     1
4       17567        1     1
5       20248        0     2

1
我认为要创建3分钟的时间间隔,您应该使用 minute(event_time) %/% 3。在您的代码中,始终只会有两个组;小于3分钟和大于三分钟。 - cderv

5

以下是使用 data.table 的解决方案。相同的逻辑:

  • 创建时间间隔的组
  • 按此组进行汇总(计数)

这是一行代码,使用 data.table 简洁的语法。

df <- data.frame(facility_id = c(20248, 12445, 20248, 17567, 17567, 10459),
                 event_time = as.POSIXct(c("2018-01-01 00:00:01", "2018-01-01 00:00:04", "2018-01-01 00:00:08", "2018-01-01 00:00:47", "2018-01-01 00:03:50", "2018-01-01 00:04:01")))

library(data.table)

setDT(df)
df[, .(count = .N), by = .(facility_id, interval= minute(event_time) %/% 3)]
#>    facility_id interval count
#> 1:       20248        0     2
#> 2:       12445        0     1
#> 3:       17567        0     1
#> 4:       17567        1     1
#> 5:       10459        1     1

本文创建于2018年1月14日,使用了reprex包(版本为v0.1.1.9000)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接