【问题标题】:Calculating number of days using criterion使用标准计算天数
【发布时间】:2021-03-03 02:14:38
【问题描述】:

概述

假设:假设我是一个狂热的运动员。我有一个数据集,每次我去划船/滑雪/无论什么时候都会记录下来。我想计算自每个给定区域发生的最后一次假设事故以来经过的天数。

我的数据

这是我的一小部分可重复的数据:

mydata <- data.frame(state = c(rep("Vermont", 5), rep("New Hampshire", 5)),
                     date = c("2016-01-01", "2016-01-03", "2016-01-04", "2016-01-04", "2016-02-01",
                              "2016-01-03", "2016-01-15", "2016-01-16", "2016-02-01", "2016-02-03"),
                     accident = c(1, 0, 0, 1, 1,
                                  0, 1, 1, 0, 1))

这就是它的样子。请注意,日期是“参差不齐的”——我有时会连续两天滑雪/划船,有时我会休息一周。另请注意,我在多个州进行这些体育活动,并且我想group_by 该州,从而在我第一次在该地区滑雪/划船时得到NA 值。

          state       date accident
        Vermont 2016-01-01        1
        Vermont 2016-01-02        0
        Vermont 2016-01-03        0
        Vermont 2016-01-04        1
        Vermont 2016-02-01        1
  New Hampshire 2016-01-03        0
  New Hampshire 2016-01-15        1
  New Hampshire 2016-01-16        1
  New Hampshire 2016-02-01        0
  New Hampshire 2016-02-03        1

我想制作这个:

          state       date accident   numdays
        Vermont 2016-01-01        1        NA
        Vermont 2016-01-02        0         1
        Vermont 2016-01-03        0         2
        Vermont 2016-01-04        1         3
        Vermont 2016-02-01        1        28
  New Hampshire 2016-01-03        0        NA
  New Hampshire 2016-01-15        1        NA
  New Hampshire 2016-01-16        1         1
  New Hampshire 2016-02-01        0        16
  New Hampshire 2016-02-03        1        18

*已编辑以更正数据中的拼写错误

【问题讨论】:

    标签: r date lubridate


    【解决方案1】:

    这是一种选择:

    创建一个包含事故发生日期的新列。使用tidyr::fill 将未发生事故的天数填充为之前的值。对于每个state,计算自上次事故发生以来经过的天数。

    library(dplyr)
    
    mydata %>%
      mutate(date = as.Date(date), 
             numdays = replace(date, accident == 0, NA)) %>%
      group_by(state) %>%
      mutate(numdays = lag(numdays)) %>%
      tidyr::fill(numdays) %>%
      mutate(numdays = as.integer(date - numdays))
    
    #   state         date       accident numdays
    #   <chr>         <date>        <dbl>   <int>
    # 1 Vermont       2016-01-01        1      NA
    # 2 Vermont       2016-01-02        0       1
    # 3 Vermont       2016-01-03        0       2
    # 4 Vermont       2016-01-04        1       3
    # 5 Vermont       2016-02-01        1      28
    # 6 New Hampshire 2016-01-03        0      NA
    # 7 New Hampshire 2016-01-15        1      NA
    # 8 New Hampshire 2016-01-16        1       1
    # 9 New Hampshire 2016-02-01        0      16
    #10 New Hampshire 2016-02-03        1      18
    

    数据

    date 的几个条目中可能有错字,我已在下面更正。

    mydata <- data.frame(state = c(rep("Vermont", 5), rep("New Hampshire", 5)),
                         date = c("2016-01-01", "2016-01-02", "2016-01-03", "2016-01-04", "2016-02-01",
                                  "2016-01-03", "2016-01-15", "2016-01-16", "2016-02-01", "2016-02-03"),
                         accident = c(1, 0, 0, 1, 1,
                                      0, 1, 1, 0, 1))
    

    【讨论】:

    • Ronak - 非常感谢!这太棒了:)
    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多