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))