如何生成包含开始日期和结束日期的时间序列的运行总计?

问题描述 投票:0回答:1

我有每行的开始日期和结束日期的数据(包括一些 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
分组。

r
1个回答
0
投票

关键是转为长格式,按日期排列,并有条件地计算

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
© www.soinside.com 2019 - 2024. All rights reserved.