在R中的一天中查找特定事件的发生

Finding occurrence of specific event in a day in R

我有两个问题

首先,我想使用 R 查找给定日期间隔后特定事件的 occurrences/repetitions 数。下面是我的示例数据,

日期 小时 事件
21-08-2019 00 No_Event
21-08-2019 01 No_Event
21-08-2019 02 No_Event
21-08-2019 03 No_Event
21-08-2019 04 持有
21-08-2019 05 持有
21-08-2019 06 No_Event
21-08-2019 07 No_Event
21-08-2019 08 持有
21-08-2019 09 持有
21-08-2019 09 事件

期望的输出是,

日期 事件 计数
21-08-2019 No_Event 2
21-08-2019 持有 2
21-08-2019 事件 1

第二个问题,

如何在包含大约 100 个数据帧的列表中重复此操作?

我们可以在 'Event' 列上创建一个 运行-length-id 序列列,按 'Date'、'Event' 进行分组,得到不同的 'grp' 在 summarise

中创建 (n_distinct)
library(dplyr)
library(data.table)
df1 %>% 
     mutate(grp = rleid(Event)) %>%
     group_by(Date, Event) %>% 
     summarise(Count = n_distinct(grp), .groups = 'drop')

-输出

# A tibble: 3 x 3
  Date       Event    Count
  <chr>      <chr>    <int>
1 21-08-2019 Event        1
2 21-08-2019 Hold         2
3 21-08-2019 No_Event     2

或者在 base Rrle 中,通过 'Event' 创建序列,获取所选列的 unique 行,然后 aggregate 到 return 'grp' 的 length 按日期、事件

分组
aggregate(cbind(Count = grp) ~ ., unique(transform(df1,
   grp = with(rle(Event), rep(seq_along(values), lengths)))[-2]), FUN = length)
        Date    Event Count
1 21-08-2019    Event     1
2 21-08-2019     Hold     2
3 21-08-2019 No_Event     2

list

中重复
library(purrr)
lst2 <- map(lst1, ~ .x %>%
       %>% 
     mutate(grp = rleid(Event)) %>%
     group_by(Date, Event) %>% 
     summarise(Count = n_distinct(grp), .groups = 'drop'))

数据

df1 <- structure(list(Date = c("21-08-2019", "21-08-2019", "21-08-2019", 
"21-08-2019", "21-08-2019", "21-08-2019", "21-08-2019", "21-08-2019", 
"21-08-2019", "21-08-2019", "21-08-2019"), Hour = c(0L, 1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 9L, 9L), Event = c("No_Event", "No_Event", 
"No_Event", "No_Event", "Hold", "Hold", "No_Event", "No_Event", 
"Hold", "Hold", "Event")),
 class = "data.frame", row.names = c(NA, 
-11L))

对于每个 DateEvent,您可以计算出小时数之差大于 1 的次数。

library(dplyr)
library(lubridate)

df %>%
  mutate(Date = dmy(Date), 
         Hour = as.numeric(Hour)) %>%
  arrange(Date, Hour) %>%
  group_by(Date, Event) %>%
  summarise(Count = sum(diff(Hour) > 1) + 1, .groups = 'drop')

#  Date       Event    Count
#  <date>     <chr>    <dbl>
#1 2019-08-21 Event        1
#2 2019-08-21 Hold         2
#3 2019-08-21 No_Event     2