【问题标题】:Count the occurences of accidents until the next accidents计算事故的发生直到下一次事故
【发布时间】:2022-01-22 08:46:50
【问题描述】:

我有以下数据框,我想创建“OUTPUT_COLUMN”。

列说明:

  • ID 是策略的标识号
  • ID_REG_YEAR 是每个注册年份的标识号
  • CALENDAR_YEAR 是政策暴露的年份
  • NUMBER_OF_RENEWALS 是政策已续订的数字计数
  • ACCIDENT 是事故发生

数据集的关键: ID_REG_YEAR 和 CALENDAR_YEAR

基本上,如果列 NUMBER_OF_RENEWALS = 0 则 OUTPUT_COLUMN = 100。之前未发生事故的任何行都应包含 100(例如第 13、16、17 行)。如果发生事故,我想计算下一次事故前的续订次数。


   ID ID_REG_YEAR CALENDAR_YEAR NUMBER_OF_RENEWALS ACCIDENT OUTPUT_COLUMN
1   A      A_2015          2015                  0      YES           100
2   A      A_2015          2016                  0      YES           100
3   A      A_2016          2016                  1      YES             0
4   A      A_2016          2017                  1      YES             0
5   A      A_2017          2017                  2       NO             1
6   A      A_2017          2018                  2       NO             1
7   A      A_2018          2018                  3       NO             2
8   A      A_2018          2019                  3       NO             2
9   A      A_2019          2019                  4      YES             0
10  A      A_2019          2020                  4      YES             0
11  B      B_2015          2015                  0       NO           100
12  B      B_2015          2016                  0       NO           100
13  B      B_2016          2016                  1       NO           100
14  C      C_2013          2013                  0       NO           100
15  C      C_2013          2014                  0       NO           100
16  C      C_2014          2014                  1       NO           100
17  C      C_2014          2015                  1       NO           100
18  C      C_2015          2015                  2      YES             0
19  C      C_2015          2016                  2      YES             0
20  C      C_2016          2016                  3       NO             1
21  C      C_2016          2017                  3       NO             1
22  C      C_2017          2017                  4       NO             2
23  C      C_2017          2018                  4       NO             2
24  C      C_2018          2018                  5      YES             0
25  C      C_2018          2019                  5      YES             0
26  C      C_2019          2019                  6       NO             1
27  C      C_2019          2020                  6       NO             1
28  C      C_2020          2020                  7       NO             2
        

【问题讨论】:

    标签: r dataframe dplyr data.table


    【解决方案1】:

    这是一个dplyr 解决方案。首先,为注册年份获取一个单独的列,该列将用于计算自上次事故以来的续订(假设这是自上次事故以来的年份)。然后,在按ID 分组后创建一列以包含上次事故的年份。使用fill 将传播此值。最终结果列将设置为 100(如果之前没有事故,或 NUMBER_OF_RENEWALS 为零)与注册年份 - 上次事故年份。

    library(dplyr)
    
    df %>%
      separate(ID_REG_YEAR, into = c("ID_REG", "REG_YEAR"), convert = T) %>%
      group_by(ID) %>%
      mutate(LAST_ACCIDENT = ifelse(ACCIDENT == "YES", REG_YEAR, NA_integer_)) %>%
      fill(LAST_ACCIDENT, .direction = "down") %>%
      mutate(OUTPUT_COLUMN_2 = ifelse(
        is.na(LAST_ACCIDENT) | NUMBER_OF_RENEWALS == 0, 100, REG_YEAR - LAST_ACCIDENT
      ))
    

    输出

       ID    ID_REG REG_YEAR CALENDAR_YEAR NUMBER_OF_RENEWALS ACCIDENT OUTPUT_COLUMN LAST_ACCIDENT OUTPUT_COLUMN_2
       <chr> <chr>     <int>         <int>              <int> <chr>            <int>         <int>           <dbl>
     1 A     A          2015          2015                  0 YES                100          2015             100
     2 A     A          2015          2016                  0 YES                100          2015             100
     3 A     A          2016          2016                  1 YES                  0          2016               0
     4 A     A          2016          2017                  1 YES                  0          2016               0
     5 A     A          2017          2017                  2 NO                   1          2016               1
     6 A     A          2017          2018                  2 NO                   1          2016               1
     7 A     A          2018          2018                  3 NO                   2          2016               2
     8 A     A          2018          2019                  3 NO                   2          2016               2
     9 A     A          2019          2019                  4 YES                  0          2019               0
    10 A     A          2019          2020                  4 YES                  0          2019               0
    # … with 18 more rows
    

    注意:如果您想使用您的保单编号 (NUMBER_OF_RENEWALS) 而不是按年计算,您可以执行类似的操作。您可以包括最近的事故政策,而不是添加最后一个事故年份的列。然后,您的输出列可以反映保单编号而不是年份(考虑可能会跳过一年或多年)。

    df %>%
      separate(ID_REG_YEAR, into = c("ID_REG", "REG_YEAR"), convert = T) %>%
      group_by(ID) %>%
      mutate(LAST_ACCIDENT_POLICY = ifelse(ACCIDENT == "YES", NUMBER_OF_RENEWALS, NA_integer_)) %>%
      fill(LAST_ACCIDENT_POLICY, .direction = "down") %>%
      mutate(OUTPUT_COLUMN_2 = ifelse(
        is.na(LAST_ACCIDENT_POLICY) | NUMBER_OF_RENEWALS == 0, 100, NUMBER_OF_RENEWALS - LAST_ACCIDENT_POLICY
      )) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 2013-09-17
      • 1970-01-01
      • 2014-11-13
      • 2019-03-22
      • 2020-10-22
      • 1970-01-01
      相关资源
      最近更新 更多