在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 R
和 rle
中,通过 '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))
对于每个 Date
和 Event
,您可以计算出小时数之差大于 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
我有两个问题
首先,我想使用 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 R
和 rle
中,通过 '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))
对于每个 Date
和 Event
,您可以计算出小时数之差大于 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