r-在开始日期和结束日期之间生成累积总和、总和和唯一标识符 我想做什么

r-在开始日期和结束日期之间生成累积总和、总和和唯一标识符 我想做什么,r,date,dplyr,lubridate,R,Date,Dplyr,Lubridate,我有一个美国抗议事件的数据集。一些事件是独立事件,而另一些事件则日复一日地持续(“多日事件”)。我的数据集是在每日级别构建的,因此一个为期三天的多日事件分布在三行上 我想做到以下几点: 在任何给定的多日事件中创建迄今为止的累计天数总和。具体来说,我想计算任何链接事件的“第一天”和“最后一天”之间的天数 将每个多事件的总天数作为变量 “命名”每个多日事件,方法是将抗议发生的州与每个州从1开始并向上延伸的顺序标识号连接起来 数据 下面是一个可复制的示例: # Library library(tidy

我有一个美国抗议事件的数据集。一些事件是独立事件,而另一些事件则日复一日地持续(“多日事件”)。我的数据集是在每日级别构建的,因此一个为期三天的多日事件分布在三行上

我想做到以下几点:

  • 在任何给定的多日事件中创建迄今为止的累计天数总和。具体来说,我想计算任何链接事件的“第一天”和“最后一天”之间的天数
  • 将每个多事件的总天数作为变量
  • “命名”每个多日事件,方法是将抗议发生的州与每个州从1开始并向上延伸的顺序标识号连接起来
  • 数据 下面是一个可复制的示例:

    # 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