我有一个数据框架,它有两个列,Ticker和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发布于 2019-10-04 20:07:48
使用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发布于 2019-10-04 19:50:00
一种选择是首先将“Date”转换为Date类,uncount将按“Ticker”分组的每一行展开'n‘次数,从'Date’的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'))或者另一种选择是使用mutate和unnest创建一个mutate列
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发布于 2019-10-04 20:52:59
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-08https://stackoverflow.com/questions/58242406
复制相似问题