r-在开始日期和结束日期之间生成累积总和、总和和唯一标识符 我想做什么
我有一个美国抗议事件的数据集。一些事件是独立事件,而另一些事件则日复一日地持续(“多日事件”)。我的数据集是在每日级别构建的,因此一个为期三天的多日事件分布在三行上 我想做到以下几点:r-在开始日期和结束日期之间生成累积总和、总和和唯一标识符 我想做什么,r,date,dplyr,lubridate,R,Date,Dplyr,Lubridate,我有一个美国抗议事件的数据集。一些事件是独立事件,而另一些事件则日复一日地持续(“多日事件”)。我的数据集是在每日级别构建的,因此一个为期三天的多日事件分布在三行上 我想做到以下几点: 在任何给定的多日事件中创建迄今为止的累计天数总和。具体来说,我想计算任何链接事件的“第一天”和“最后一天”之间的天数 将每个多事件的总天数作为变量 “命名”每个多日事件,方法是将抗议发生的州与每个州从1开始并向上延伸的顺序标识号连接起来 数据 下面是一个可复制的示例: # Library library(tidy
# Library
library(tidyverse) # Brings in dplyr
# Generate the data set of protests
test <- data.frame(state = c(rep("Washington", 10), rep("Idaho", 10)),
date = lubridate::ymd(c("2021-01-01", "2021-01-03", "2021-01-04", "2021-01-10", "2021-01-15",
"2021-01-16", "2021-01-17", "2021-01-18", "2021-01-19", "2021-01-28",
"2021-01-12", "2021-01-13", "2021-01-14", "2021-02-01", "2021-02-03",
"2021-02-04", "2021-02-05", "2021-02-08", "2021-02-10", "2021-02-14")))
# Now create some lags and leads
test <- test %>%
group_by(state) %>%
mutate(date_lag = lag(date),
date_lead = lead(date),
days_last = date - date_lag,
days_next = date_lead - date,
link_last = if_else(days_last <= 1, 1, 0),
link_next = if_else(days_next <= 1, 1, 0),
sequence = if_else(link_last == 0 & link_next == 1, "First day",
if_else(is.na(link_last) == TRUE & link_next == 1, "First day",
if_else(link_last == 1 & link_next == 1, "Ongoing",
if_else(link_last == 1 & link_next == 0, "Last day",
if_else(link_last == 1 & is.na(link_next)==TRUE, "Last day", "Not linked"))))))
#库
图书馆(tidyverse)#引入dplyr
#生成抗议的数据集
测试%
突变(日期)滞后=滞后(日期),
日期\潜在客户=潜在客户(日期),
最后天数=日期-日期滞后,
天\下一个=日期\提前期-日期,
link_last=if_else(days_last我认为创建特定的函数来进行计数比尝试在单个管道中进行所有操作都要容易
我在输出中留下了所有中间步骤和中间列,这样您就可以看到每个步骤都在做什么。很可能您不需要保留所有这些列,而且一旦您了解了方法,您可能可以简化这些步骤
library(tidyverse)#引入dplyr
#生成抗议的数据集
test我认为创建特定的函数来进行计数比尝试在单个管道中进行任何操作都要容易
我在输出中留下了所有中间步骤和中间列,这样您就可以看到每个步骤都在做什么。很可能您不需要保留所有这些列,而且一旦您了解了方法,您可能可以简化这些步骤
library(tidyverse)#引入dplyr
#生成抗议的数据集
test我不确定这些是您要查找的具体数字,但在我看来,这代表了一种更简单、更惯用的tidyverse方法:
test %>%
group_by(state) %>%
mutate(days_last = as.numeric(date - lag(date)),
new_section = 1*(is.na(days_last) | days_last > 1), # EDIT
section = cumsum(new_section),
name = paste(state,section, sep = ".")) %>%
group_by(name) %>%
mutate(duration = as.numeric(max(date) - min(date) + 1),
sequence = case_when(duration == 1 ~ "Unlinked",
row_number() == 1 ~ "First Day",
row_number() == n() ~ "Last Day",
TRUE ~ "Ongoing")) %>%
ungroup()
在这里,我将任何超过一天的间隔标记为一个新事件,取累计总和,并使用它来定义每个事件的持续时间
# A tibble: 20 x 8
state date days_last new_section section name duration sequence
<chr> <date> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
1 Washington 2021-01-01 NA 1 1 Washington.1 1 Unlinked
2 Washington 2021-01-03 2 1 2 Washington.2 2 First Day
3 Washington 2021-01-04 1 0 2 Washington.2 2 Last Day
4 Washington 2021-01-10 6 1 3 Washington.3 1 Unlinked
5 Washington 2021-01-15 5 1 4 Washington.4 5 First Day
6 Washington 2021-01-16 1 0 4 Washington.4 5 Ongoing
7 Washington 2021-01-17 1 0 4 Washington.4 5 Ongoing
8 Washington 2021-01-18 1 0 4 Washington.4 5 Ongoing
9 Washington 2021-01-19 1 0 4 Washington.4 5 Last Day
10 Washington 2021-01-28 9 1 5 Washington.5 1 Unlinked
11 Idaho 2021-01-12 NA 1 1 Idaho.1 3 First Day
12 Idaho 2021-01-13 1 0 1 Idaho.1 3 Ongoing
13 Idaho 2021-01-14 1 0 1 Idaho.1 3 Last Day
14 Idaho 2021-02-01 18 1 2 Idaho.2 1 Unlinked
15 Idaho 2021-02-03 2 1 3 Idaho.3 3 First Day
16 Idaho 2021-02-04 1 0 3 Idaho.3 3 Ongoing
17 Idaho 2021-02-05 1 0 3 Idaho.3 3 Last Day
18 Idaho 2021-02-08 3 1 4 Idaho.4 1 Unlinked
19 Idaho 2021-02-10 2 1 5 Idaho.5 1 Unlinked
20 Idaho 2021-02-14 4 1 6 Idaho.6 1 Unlinked
#一个tible:20x8
状态日期天数\u上次新建\u节名称持续时间序列
华盛顿2021-01-01北美1华盛顿1未链接
华盛顿2021-01-03华盛顿第一天
华盛顿2021-01-04华盛顿最后一天
4华盛顿2021-01-10 6 1华盛顿3 1未链接
华盛顿2021-01-15华盛顿4.5第一天
华盛顿2021-01-16华盛顿4正在进行
7华盛顿2021-01-17华盛顿4正在进行
华盛顿2021-01-18华盛顿4正在进行
9华盛顿2021-01-19华盛顿4最后一天
10华盛顿2021-01-28 9 15华盛顿5 1未链接
11爱达荷州2021-01-12北美爱达荷州。13第一天
12爱达荷州2021-01-13 10 1爱达荷州1 3正在进行
13爱达荷州2021-01-14 10爱达荷州最后一天
14爱达荷州2021-02-01 18爱达荷州2未链接
15爱达荷州2021-02-03爱达荷州3第一天
16爱达荷州2021-02-04
17爱达荷2021-02-05 10 3爱达荷最后一天
18爱达荷州2021-02-08 3 1爱达荷州4 1未链接
19爱达荷州2021-02-10 2 1 5爱达荷州5 1未链接
20爱达荷州2021-02-14 4 1 6爱达荷州6 1未链接
我不确定这些是您要查找的具体数字,但在我看来,这是一种更简单、更惯用的tidyverse方法:
test %>%
group_by(state) %>%
mutate(days_last = as.numeric(date - lag(date)),
new_section = 1*(is.na(days_last) | days_last > 1), # EDIT
section = cumsum(new_section),
name = paste(state,section, sep = ".")) %>%
group_by(name) %>%
mutate(duration = as.numeric(max(date) - min(date) + 1),
sequence = case_when(duration == 1 ~ "Unlinked",
row_number() == 1 ~ "First Day",
row_number() == n() ~ "Last Day",
TRUE ~ "Ongoing")) %>%
ungroup()
在这里,我将任何超过一天的间隔标记为一个新事件,取累计总和,并使用它来定义每个事件的持续时间
# A tibble: 20 x 8
state date days_last new_section section name duration sequence
<chr> <date> <dbl> <dbl> <dbl> <chr> <dbl> <chr>
1 Washington 2021-01-01 NA 1 1 Washington.1 1 Unlinked
2 Washington 2021-01-03 2 1 2 Washington.2 2 First Day
3 Washington 2021-01-04 1 0 2 Washington.2 2 Last Day
4 Washington 2021-01-10 6 1 3 Washington.3 1 Unlinked
5 Washington 2021-01-15 5 1 4 Washington.4 5 First Day
6 Washington 2021-01-16 1 0 4 Washington.4 5 Ongoing
7 Washington 2021-01-17 1 0 4 Washington.4 5 Ongoing
8 Washington 2021-01-18 1 0 4 Washington.4 5 Ongoing
9 Washington 2021-01-19 1 0 4 Washington.4 5 Last Day
10 Washington 2021-01-28 9 1 5 Washington.5 1 Unlinked
11 Idaho 2021-01-12 NA 1 1 Idaho.1 3 First Day
12 Idaho 2021-01-13 1 0 1 Idaho.1 3 Ongoing
13 Idaho 2021-01-14 1 0 1 Idaho.1 3 Last Day
14 Idaho 2021-02-01 18 1 2 Idaho.2 1 Unlinked
15 Idaho 2021-02-03 2 1 3 Idaho.3 3 First Day
16 Idaho 2021-02-04 1 0 3 Idaho.3 3 Ongoing
17 Idaho 2021-02-05 1 0 3 Idaho.3 3 Last Day
18 Idaho 2021-02-08 3 1 4 Idaho.4 1 Unlinked
19 Idaho 2021-02-10 2 1 5 Idaho.5 1 Unlinked
20 Idaho 2021-02-14 4 1 6 Idaho.6 1 Unlinked
#一个tible:20x8
状态日期天数\u上次新建\u节名称持续时间序列
华盛顿2021-01-01北美1华盛顿1未链接
华盛顿2021-01-03华盛顿第一天
华盛顿2021-01-04华盛顿最后一天
4华盛顿2021-01-10 6 1华盛顿3 1未链接
华盛顿2021-01-15华盛顿4.5第一天
华盛顿2021-01-16华盛顿4正在进行
7华盛顿2021-01-17华盛顿4正在进行
华盛顿2021-01-18华盛顿4正在进行
9华盛顿2021-01-19华盛顿4最后一天
10华盛顿2021-01-28 9 15华盛顿5 1未链接
11爱达荷州2021-01-12北美爱达荷州。13第一天
12爱达荷州2021-01-13 10 1爱达荷州1 3正在进行
13爱达荷州2021-01-14 10爱达荷州最后一天
14爱达荷州2021-02-01 18爱达荷州2未链接
15
library(dplyr)
library(data.table)
test %>%
dplyr::group_by(state) %>%
dplyr::mutate(days_last = c(NA, diff(date)),
days_next = as.numeric(lead(date) - date),
name = paste0(state, ".", data.table::rleid(days_last == 1 | days_next == 1))) %>%
dplyr::group_by(name) %>%
dplyr::mutate(sequence = case_when(
n() == 1 ~ "Not Linked",
row_number() == 1 ~ "First day",
n() == row_number() ~ "Last day",
T ~ "Ongoing"),
duration = n(),
cumulative = seq_along(name)) %>%
dplyr::ungroup()
state date days_last days_next name sequence duration cumulative
<chr> <date> <dbl> <dbl> <chr> <chr> <int> <int>
1 Washington 2021-01-01 NA 2 Washington.1 Not Linked 1 1
2 Washington 2021-01-03 2 1 Washington.2 First day 2 1
3 Washington 2021-01-04 1 6 Washington.2 Last day 2 2
4 Washington 2021-01-10 6 5 Washington.3 Not Linked 1 1
5 Washington 2021-01-15 5 1 Washington.4 First day 5 1
6 Washington 2021-01-16 1 1 Washington.4 Ongoing 5 2
7 Washington 2021-01-17 1 1 Washington.4 Ongoing 5 3
8 Washington 2021-01-18 1 1 Washington.4 Ongoing 5 4
9 Washington 2021-01-19 1 9 Washington.4 Last day 5 5
10 Washington 2021-01-28 9 NA Washington.5 Not Linked 1 1
11 Idaho 2021-01-12 NA 1 Idaho.1 First day 3 1
12 Idaho 2021-01-13 1 1 Idaho.1 Ongoing 3 2
13 Idaho 2021-01-14 1 18 Idaho.1 Last day 3 3
14 Idaho 2021-02-01 18 2 Idaho.2 Not Linked 1 1
15 Idaho 2021-02-03 2 1 Idaho.3 First day 3 1
16 Idaho 2021-02-04 1 1 Idaho.3 Ongoing 3 2
17 Idaho 2021-02-05 1 3 Idaho.3 Last day 3 3
18 Idaho 2021-02-08 3 2 Idaho.4 First day 2 1
19 Idaho 2021-02-10 2 4 Idaho.4 Last day 2 2
20 Idaho 2021-02-14 4 NA Idaho.5 Not Linked 1 1
NA == 0 & 1 == 1
[1] NA
is.na(NA) & 1 == 1
[1] TRUE