【问题标题】:Pivot longer with start and end dates使用开始日期和结束日期延长时间轴
【发布时间】:2022-10-13 23:45:14
【问题描述】:

我真诚地希望以前有人问过这个问题,如果是这样,我会很高兴被投入到现有的线程中。

我的数据基本上包含有关由它们各自的开始和结束日期标记的几个时间段的信息。我想转换这些数据,以便这些开始日期和结束日期之间的每个日期都是它自己的观察结果,其中包含与时间范围相关的所有数据。

到目前为止,我最好的猜测是为每一行使用一个 for 循环,基本上为每个观察创建一个新的 data.frame 并将它们全部缝合在一起。但是,我意识到这不是一种甚至是中等效率的方法,而且由于我正在使用的数据集往往相当大,我希望有一种性能更高的方法。

我希望沿着 tidyverse pivot_longer 的路线找到一种方法,因为在我看来它似乎有模糊的联系。

原始数据与此示例类似:

 data.frame(Location = c("Berlin", "Amsterdam"),
                            Value = c("A", "B"),
                            Starting = c("2001-01-01", "2001-01-08"),
                            Ending = c("2001-01-03", "2001-01-10"))

   Location Value   Starting     Ending
1    Berlin     A 2001-01-01 2001-01-03
2 Amsterdam     B 2001-01-08 2001-01-10

理想的输出看起来像这样:

data.frame(Location = rep(c("Berlin", "Amsterdam"), each = 3),
           Date = c("2001-01-01", "2001-01-02", "2001-01-03", "2001-01-08", "2001-01-09", "2001-01-10"),
           Value = rep(c("A", "B"), each = 3))

   Location       Date Value
1    Berlin 2001-01-01     A
2    Berlin 2001-01-02     A
3    Berlin 2001-01-03     A
4 Amsterdam 2001-01-08     B
5 Amsterdam 2001-01-09     B
6 Amsterdam 2001-01-10     B

【问题讨论】:

    标签: r date tidyr lubridate


    【解决方案1】:

    在使用seq 创建list 列后,我们可以unnest

    library(dplyr)
    library(purrr)
    library(tidyr)
    df1 %>% 
      transmute(Location, Value, Date = map2(as.Date(Starting), 
           as.Date(Ending), seq, by = "1 day")) %>%
      unnest(Date)
    

    -输出

    # A tibble: 6 × 3
      Location  Value Date      
      <chr>     <chr> <date>    
    1 Berlin    A     2001-01-01
    2 Berlin    A     2001-01-02
    3 Berlin    A     2001-01-03
    4 Amsterdam B     2001-01-08
    5 Amsterdam B     2001-01-09
    6 Amsterdam B     2001-01-10
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2020-10-05
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多