根据R中的分组变量为连续几天的特定序列创建ID
Create ID for specific sequence of consecutive days based on grouping variable in R
对于国家/地区天级别的事件列表,我们想为特定国家/地区的连续几天创建一个唯一 ID(如果一个国家/地区连续两天或更多天的事件 - > 创建唯一 ID),以便我最终可以将数据框减少到特定的事件序列而不是事件日期。
我没有设法根据事件的顺序汇总数据。我相信此响应是相似的 (Creating groups of consecutive days meeting a given criteria),但它在 SQL.
中
数据格式如下:
country <- c("Angola","Angola","Angola","Angola","Angola", "Benin","Benin","Benin","Benin","Benin","Benin")
event_date <- as.Date(c("2017-06-16", "2017-06-17", "2017-06-18", "2017-08-22", "2017-08-23", "2019-04-18", "2019-04-19", "2019-04-20", "2018-03-15", "2018-03-16", "2016-03-17"))
mydata <- data.frame(country, event_date)
在输出中,我希望有一个新列,其中包含一个国家/地区的每个系列事件的唯一 ID:
seq.ID <- c(1,1,1,2,2,3,3,3,4,4,4)
mydata2 <- data.frame(country, event_date, seq.ID)
以便最终,我可以将数据简化为国家和事件顺序级别:
mydata3 <- mydata2[!duplicated(mydata2$seq.ID),]
尝试:
library(dplyr)
mydata %>%
group_by(country) %>%
distinct(seq.ID = cumsum(event_date != lag(event_date, default = first(event_date)) + 1L)
输出:
# A tibble: 5 x 2
# Groups: country [2]
seq.ID country
<int> <fct>
1 1 Angola
2 2 Angola
3 1 Benin
4 2 Benin
5 3 Benin
您还可以在 distinct
中使用 .keep_all
参数并保留每个序列的第一个日期:
mydata %>%
group_by(country) %>%
distinct(seq.ID = cumsum(event_date != lag(event_date, default = first(event_date)) + 1L),
.keep_all = TRUE)
# A tibble: 5 x 3
# Groups: country [2]
country event_date seq.ID
<fct> <date> <int>
1 Angola 2017-06-16 1
2 Angola 2017-08-22 2
3 Benin 2019-04-18 1
4 Benin 2018-03-15 2
5 Benin 2016-03-17 3
如果需要具有不同序列 ID 的非聚合输出,您可以这样做:
mydata %>%
mutate(
seq.ID = cumsum(
(event_date != lag(event_date, default = first(event_date)) + 1L) |
country != lag(country, default = first(country))
)
)
country event_date seq.ID
1 Angola 2017-06-16 1
2 Angola 2017-06-17 1
3 Angola 2017-06-18 1
4 Angola 2017-08-22 2
5 Angola 2017-08-23 2
6 Benin 2019-04-18 3
7 Benin 2019-04-19 3
8 Benin 2019-04-20 3
9 Benin 2018-03-15 4
10 Benin 2018-03-16 4
11 Benin 2016-03-17 5
请注意,您最后一个 event_date
中有错别字,这就是输出与您期望的输出不 100% 对应的原因。
对于国家/地区天级别的事件列表,我们想为特定国家/地区的连续几天创建一个唯一 ID(如果一个国家/地区连续两天或更多天的事件 - > 创建唯一 ID),以便我最终可以将数据框减少到特定的事件序列而不是事件日期。
我没有设法根据事件的顺序汇总数据。我相信此响应是相似的 (Creating groups of consecutive days meeting a given criteria),但它在 SQL.
中数据格式如下:
country <- c("Angola","Angola","Angola","Angola","Angola", "Benin","Benin","Benin","Benin","Benin","Benin")
event_date <- as.Date(c("2017-06-16", "2017-06-17", "2017-06-18", "2017-08-22", "2017-08-23", "2019-04-18", "2019-04-19", "2019-04-20", "2018-03-15", "2018-03-16", "2016-03-17"))
mydata <- data.frame(country, event_date)
在输出中,我希望有一个新列,其中包含一个国家/地区的每个系列事件的唯一 ID:
seq.ID <- c(1,1,1,2,2,3,3,3,4,4,4)
mydata2 <- data.frame(country, event_date, seq.ID)
以便最终,我可以将数据简化为国家和事件顺序级别:
mydata3 <- mydata2[!duplicated(mydata2$seq.ID),]
尝试:
library(dplyr)
mydata %>%
group_by(country) %>%
distinct(seq.ID = cumsum(event_date != lag(event_date, default = first(event_date)) + 1L)
输出:
# A tibble: 5 x 2
# Groups: country [2]
seq.ID country
<int> <fct>
1 1 Angola
2 2 Angola
3 1 Benin
4 2 Benin
5 3 Benin
您还可以在 distinct
中使用 .keep_all
参数并保留每个序列的第一个日期:
mydata %>%
group_by(country) %>%
distinct(seq.ID = cumsum(event_date != lag(event_date, default = first(event_date)) + 1L),
.keep_all = TRUE)
# A tibble: 5 x 3
# Groups: country [2]
country event_date seq.ID
<fct> <date> <int>
1 Angola 2017-06-16 1
2 Angola 2017-08-22 2
3 Benin 2019-04-18 1
4 Benin 2018-03-15 2
5 Benin 2016-03-17 3
如果需要具有不同序列 ID 的非聚合输出,您可以这样做:
mydata %>%
mutate(
seq.ID = cumsum(
(event_date != lag(event_date, default = first(event_date)) + 1L) |
country != lag(country, default = first(country))
)
)
country event_date seq.ID
1 Angola 2017-06-16 1
2 Angola 2017-06-17 1
3 Angola 2017-06-18 1
4 Angola 2017-08-22 2
5 Angola 2017-08-23 2
6 Benin 2019-04-18 3
7 Benin 2019-04-19 3
8 Benin 2019-04-20 3
9 Benin 2018-03-15 4
10 Benin 2018-03-16 4
11 Benin 2016-03-17 5
请注意,您最后一个 event_date
中有错别字,这就是输出与您期望的输出不 100% 对应的原因。