R 使用标准计算天数 概述

R 使用标准计算天数 概述,r,date,lubridate,R,Date,Lubridate,为了一个假设:想象一下,我是一个狂热的运动员。我有一个数据集,记录我每次划船/滑雪/什么的。我想计算自上一次假设事故发生在每个给定区域以来经过的天数 我的数据 以下是我的一小部分可复制数据: mydata <- data.frame(state = c(rep("Vermont", 5), rep("New Hampshire", 5)), date = c("2016-01-01", &

为了一个假设:想象一下,我是一个狂热的运动员。我有一个数据集,记录我每次划船/滑雪/什么的。我想计算自上一次假设事故发生在每个给定区域以来经过的天数

我的数据 以下是我的一小部分可复制数据:

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))
我想制作这个:

          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
*编辑以更正数据中的输入错误这里有一个选项:

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

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

罗纳克-非常感谢你!这太棒了:)
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
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))