我试图通过在缺失日期添加先前的值来将季度数据转换为每日数据。该数据包括不同股票的财务比率。我的数据有一个由两列构建的行标签:自动收报机和日期。由于我有每个股票的重复日期,我不知道如何忽略股票代码并用之前的值重新填充缺少的日期。
以下是迄今为止的一小部分数据样本:
> df_new
de eps pe ps pb
APD 2015-09-30 1.373 1.6 21.463 2.772 3.784
APD 2015-12-31 1.325 1.68 21.284 2.893 3.805
APD 2016-03-31 1.411 -2.19 56.114 3.254 4.491
SWKS 2003-03-31 0.402 -0.04 <NA> <NA> <NA>
SWKS 2003-06-30 0.397 -0.04 -2.289 1.518 0.929
SWKS 2003-09-30 0.62 -0.29 -2.799 2.046 1.877
SWKS 2003-12-31 0.643 0.03 -25.426 2.045 1.905
SWKS 2004-03-31 0.657 -0.06 -32.004 2.641 2.579
SWKS 2004-06-30 0.584 0.09 -37.18 1.825 1.782
SWKS 2004-09-30 0.555 0.1 65.806 1.881 1.962
SWKS 2004-12-31 0.525 0.09 45.823 1.777 1.912
我希望它看起来像这样(如果每周):
> df_new
de eps pe ps pb
APD 2015-09-30 1.373 1.6 21.463 2.772 3.784
APD 2015-10-01 1.373 1.6 21.463 2.772 3.784
APD 2015-10-02 1.373 1.6 21.463 2.772 3.784
APD 2015-10-03 1.373 1.6 21.463 2.772 3.784
...
APD 2015-12-31 1.325 1.68 21.284 2.893 3.805
APD 2016-01-01 1.325 1.68 21.284 2.893 3.805
APD 2016-01-02 1.325 1.68 21.284 2.893 3.805
APD 2016-01-03 1.325 1.68 21.284 2.893 3.805
...
APD 2016-03-31 1.411 -2.19 56.114 3.254 4.491
APD 2016-04-01 1.411 -2.19 56.114 3.254 4.491
APD 2016-04-02 1.411 -2.19 56.114 3.254 4.491
APD 2016-04-03 1.411 -2.19 56.114 3.254 4.491
...
SWKS 2003-03-31 0.402 -0.04 <NA> <NA> <NA>
SWKS 2003-04-01 0.402 -0.04 <NA> <NA> <NA>
SWKS 2003-04-02 0.402 -0.04 <NA> <NA> <NA>
SWKS 2003-04-03 0.402 -0.04 <NA> <NA> <NA>
...
SWKS 2003-06-30 0.397 -0.04 -2.289 1.518 0.929
and so on...
我搜索了答案和这个链接:Add missing xts/zoo data with linear interpolation in R有点接近我想要的。虽然我不知道如何处理股票代码。
非常感谢你的帮助!
答案 0 :(得分:2)
使用by
将显示的匿名函数应用于每个符号的行。该函数生成日期的网格g
,并将其与应用na.locf
的数据框的原始行合并以填充NA值。最后,我们使用do.call("rbind", ...)
将生成的"by"
对象放回原处。
library(zoo) # na.locf
df <- do.call("rbind", by(df_new, df_new$symbol, function(x) {
rng <- range(x$date, na.rm = TRUE)
g <- data.frame(date = seq(rng[1], rng[2], "day"))
na.locf(merge(x, g, all = TRUE))
}))
注意:可重复形式的输入df_new
为:
Lines <- "
APD 2015-09-30 1.373 1.6 21.463 2.772 3.784
APD 2015-12-31 1.325 1.68 21.284 2.893 3.805
APD 2016-03-31 1.411 -2.19 56.114 3.254 4.491
SWKS 2003-03-31 0.402 -0.04 <NA> <NA> <NA>
SWKS 2003-06-30 0.397 -0.04 -2.289 1.518 0.929
SWKS 2003-09-30 0.62 -0.29 -2.799 2.046 1.877
SWKS 2003-12-31 0.643 0.03 -25.426 2.045 1.905
SWKS 2004-03-31 0.657 -0.06 -32.004 2.641 2.579
SWKS 2004-06-30 0.584 0.09 -37.18 1.825 1.782
SWKS 2004-09-30 0.555 0.1 65.806 1.881 1.962
SWKS 2004-12-31 0.525 0.09 45.823 1.777 1.912"
df_new <- read.table(text = Lines,
col.names = c("symbol", "date", "de", "eps", "pe", "ps", "pb"))
df_new$date <- as.Date(df_new$date)