R语言 如何展开数据框以显示每个日期

svdrlsy4  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(161)

我有一个包含开始日期和结束日期的数据框。我希望展开该数据框,以便可以查看这两个日期之间的每个日期。
原始df:
| 开始日期|结束日期|
| - ------|- ------|
| 二○二三年一月五日|二○二三年十月一日|
| 二○二三年二月三日|二○二三年十月二日|
新DF:
| 开始日期|结束日期|当前日期|
| - ------|- ------|- ------|
| 二○二三年一月五日|二○二三年十月一日|二○二三年一月五日|
| 二○二三年一月五日|二○二三年十月一日|二○二三年六月一日|
| 二○二三年一月五日|二○二三年十月一日|二○二三年七月一日|
| 二○二三年一月五日|二○二三年十月一日|二○二三年一月八日|
| 二○二三年一月五日|二○二三年十月一日|二○二三年九月一日|
| 二○二三年一月五日|二○二三年十月一日|二○二三年十月一日|
| 二○二三年二月三日|二○二三年十月二日|二○二三年二月三日|
| 二○二三年二月三日|二○二三年十月二日|二○二三年二月四日|
| 二○二三年二月三日|二○二三年十月二日|二○二三年二月五日|
| 二○二三年二月三日|二○二三年十月二日|二○二三年二月六日|
| 二○二三年二月三日|二○二三年十月二日|二○二三年二月七日|
| 二○二三年二月三日|二○二三年十月二日|二○二三年二月八日|
| 二○二三年二月三日|二○二三年十月二日|二○二三年二月九日|
| 二○二三年二月三日|二○二三年十月二日|二○二三年十月二日|

cvxl0en2

cvxl0en21#

这样如何,您可以使用reframe()在开始日期和结束日期之间创建一个序列。

library(dplyr)
dat <- tibble::tribble(
  ~start_date,  ~end_date,
"1-5-2023", "1-10-2023",
"2-3-2023", "2-10-2023")
dat %>% 
  mutate(across(c(start_date, end_date), lubridate::mdy)) %>% 
  rowwise() %>% 
  reframe(start_date = start_date, 
          end_date = end_date, 
          curent_date = seq(start_date, end_date, by="1 day"))
#> # A tibble: 14 × 3
#>    start_date end_date   curent_date
#>    <date>     <date>     <date>     
#>  1 2023-01-05 2023-01-10 2023-01-05 
#>  2 2023-01-05 2023-01-10 2023-01-06 
#>  3 2023-01-05 2023-01-10 2023-01-07 
#>  4 2023-01-05 2023-01-10 2023-01-08 
#>  5 2023-01-05 2023-01-10 2023-01-09 
#>  6 2023-01-05 2023-01-10 2023-01-10 
#>  7 2023-02-03 2023-02-10 2023-02-03 
#>  8 2023-02-03 2023-02-10 2023-02-04 
#>  9 2023-02-03 2023-02-10 2023-02-05 
#> 10 2023-02-03 2023-02-10 2023-02-06 
#> 11 2023-02-03 2023-02-10 2023-02-07 
#> 12 2023-02-03 2023-02-10 2023-02-08 
#> 13 2023-02-03 2023-02-10 2023-02-09 
#> 14 2023-02-03 2023-02-10 2023-02-10

创建于2023年3月7日,使用reprex v2.0.2

a0x5cqrl

a0x5cqrl2#

library(data.table)

f <- \(s,e) seq(s,e,1)

setDT(df) %>% 
  .[,lapply(.SD, as.IDate, "%m-%d-%y")] %>% 
  .[,.(current_date=f(start_date, end_date)), .(start_date,end_date)]

输出:

start_date   end_date current_date
        <IDat>     <IDat>       <IDat>
 1: 2020-01-05 2020-01-10   2020-01-05
 2: 2020-01-05 2020-01-10   2020-01-06
 3: 2020-01-05 2020-01-10   2020-01-07
 4: 2020-01-05 2020-01-10   2020-01-08
 5: 2020-01-05 2020-01-10   2020-01-09
 6: 2020-01-05 2020-01-10   2020-01-10
 7: 2020-02-03 2020-02-10   2020-02-03
 8: 2020-02-03 2020-02-10   2020-02-04
 9: 2020-02-03 2020-02-10   2020-02-05
10: 2020-02-03 2020-02-10   2020-02-06
11: 2020-02-03 2020-02-10   2020-02-07
12: 2020-02-03 2020-02-10   2020-02-08
13: 2020-02-03 2020-02-10   2020-02-09
14: 2020-02-03 2020-02-10   2020-02-10

相关问题