【问题标题】:Insert a Sequence of Dates For Every Date In a dataframe为数据框中的每个日期插入一系列日期
【发布时间】:2019-10-04 19:47:37
【问题描述】:

我有一个包含两列的数据框,TickerDate。对于每个 Date 观察,我想创建一个从原始日期到原始日期 3 天的日期序列(如seq(OriginalDate, OriginalDate-3, by=1)

例如:

df = data.frame(Ticker = c("AAPL", "MSFT"), Date = c("2019-01-05", "2019-02-10"))

print(df)

Ticker Date
AAPL   2019-01-05
MSFT   2019-02-10

我希望新的数据框看起来像这样:

print(df)

Ticker Date        Date_Sequence
AAPL   2019-01-05  2019-01-05 #original Date
AAPL   2019-01-05  2019-01-04 #original Date -1
AAPL   2019-01-05  2019-01-03 #original Date -2
MSFT   2019-02-10  2019-02-10 
MSFT   2019-02-10  2019-02-09
MSFT   2019-02-10  2019-02-08

【问题讨论】:

    标签: r dataframe dplyr data.table tidyverse


    【解决方案1】:

    使用data.table

    library(data.table)
    
    setDT(df)[ , .(Date_Sequence = as.Date(Date) - 0:2), .(Ticker, Date)]
    
    #    Ticker       Date Date_Sequence
    # 1:   AAPL 2019-01-05    2019-01-05
    # 2:   AAPL 2019-01-05    2019-01-04
    # 3:   AAPL 2019-01-05    2019-01-03
    # 4:   MSFT 2019-02-10    2019-02-10
    # 5:   MSFT 2019-02-10    2019-02-09
    # 6:   MSFT 2019-02-10    2019-02-08
    

    【讨论】:

    • 或:as.Date(Date) - 0:2
    【解决方案2】:

    一种选择是首先将'Date'转换为Date类,uncount将每行扩展'n'次,按'Ticker'分组,从'的first创建一个反向日期序列日期'

    library(dplyr)
    library(tidyr)
    library(purrr)
    df %>% 
       mutate(Date = as.Date(Date)) %>%
       uncount(3) %>% 
       group_by(Ticker) %>% 
       mutate(Date_Sequence = seq(first(Date), length = n(), by = '-1 day'))
    

    或者另一种选择是使用mutateunnest 创建一个list

    df %>%
      mutate(Date = as.Date(Date),
             Date_Sequence = map(Date, seq, length = 3, by = '-1 day')) %>%
      unnest_legacy(Date_Sequence)
    #  Ticker       Date Date_Sequence
    #1   AAPL 2019-01-05    2019-01-05
    #2   AAPL 2019-01-05    2019-01-04
    #3   AAPL 2019-01-05    2019-01-03
    #4   MSFT 2019-02-10    2019-02-10
    #5   MSFT 2019-02-10    2019-02-09
    #6   MSFT 2019-02-10    2019-02-08
    

    【讨论】:

      【解决方案3】:
      df$Date <- as.Date(df$Date)
      df <- df[rep(seq(nrow(df)), each = 3),]
      df$Date_Sequence <- df$Date - 0:2
      
      df
      #     Ticker       Date Date_Sequence
      # 1     AAPL 2019-01-05    2019-01-05
      # 1.1   AAPL 2019-01-05    2019-01-04
      # 1.2   AAPL 2019-01-05    2019-01-03
      # 2     MSFT 2019-02-10    2019-02-10
      # 2.1   MSFT 2019-02-10    2019-02-09
      # 2.2   MSFT 2019-02-10    2019-02-08
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-30
        • 2022-11-27
        • 2014-02-09
        • 2022-11-22
        • 2022-01-25
        • 1970-01-01
        相关资源
        最近更新 更多