我有每行的开始日期和结束日期的数据(包括一些 NA),我想生成一个时间序列,其中包含已开始的行数和已结束的行数的运行总数。
样本数据
data.frame(
name = c("building a", "building b", "building c", "building d", "building e"),
start = as.Date(c("2011-04-09", "2011-12-30", "2012-11-10", "2015-06-05", "2017-03-12")),
end = as.Date(c("2016-05-04", NA, "2015-01-19", NA, "2019-04-06"))
)
#> name start end
#> 1 building a 2011-04-09 2016-05-04
#> 2 building b 2011-12-30 <NA>
#> 3 building c 2012-11-10 2015-01-19
#> 4 building d 2015-06-05 <NA>
#> 5 building e 2017-03-12 2019-04-06
获得建议输出的好方法是什么?
#> date started ended
#> 1 2011-04-09 1 0
#> 2 2011-12-30 2 0
#> 3 2012-11-10 3 0
#> 4 2015-01-19 3 1
#> 5 2015-06-05 4 1
#> 6 2016-05-04 4 2
#> 7 2017-03-12 5 2
#> 8 2019-04-06 5 3
我将把开始列和结束列绘制为累积折线图,这样我就可以接受任何中间数据结构,这只是我对它的外观的初步想法。例如,这个问题是类似的: 两个日期范围之间更新的累计总和。接受的答案的最后部分使用 id 列和计数列,而不是开始列和结束列。这可能会让绘图更容易,按
id
分组。
关键是转为长格式,按日期排列,并有条件地计算
start
和 end
条目:
library(tidyverse)
df %>%
pivot_longer(c(start, end), names_to = "event", values_to = "date") %>%
arrange(date) %>%
filter(!is.na(date)) %>%
mutate(started = cumsum(ifelse(event == "start", 1, 0)),
ended = cumsum(ifelse(event == "end", 1, 0))) %>%
select(date, started, ended)
#> # A tibble: 8 x 3
#> date started ended
#> <date> <dbl> <dbl>
#> 1 2011-04-09 1 0
#> 2 2011-12-30 2 0
#> 3 2012-11-10 3 0
#> 4 2015-01-19 3 1
#> 5 2015-06-05 4 1
#> 6 2016-05-04 4 2
#> 7 2017-03-12 5 2
#> 8 2019-04-06 5 3