我目前正在使用跨资产类别的期货数据集-其中涉及带有数字和字符输入的xts对象。我正在应用merge()使数据集与一致的日期对齐,但是,使用字符输入的xts对象上的merge()就像下面的示例一样,给出了NA。有没有解决的办法?
以下是示例xts对象(作为未来合约的基础)的dput输出:
uContracts <- structure(c("SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA",
"SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA",
"SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA",
"SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA",
"SPM00-USA"), class = c("xts", "zoo"), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", index = structure(c(946598400,
946857600, 946944000, 947030400, 947116800, 947203200, 947462400,
947548800, 947635200, 947721600, 947808000, 948153600, 948240000,
948326400, 948412800, 948672000, 948758400, 948844800, 948931200,
949017600), tzone = "UTC", tclass = "Date"), .Dim = c(20L, 3L
), .Dimnames = list(NULL, c("SP00-USA", "SP.1-USA", "SP.2-USA"
)))
采样日期之外的投放:
tW <- structure(c(10956, 10959, 10960, 10961, 10962, 10963, 10966,
10967, 10968, 10969, 10970, 10973, 10974, 10975, 10976, 10977,
10980, 10981, 10982, 10983), class = "Date")
我想按tW中的日期来格式化uContracts,其中tWw中不包含的tW中的任何日期,将从最后一个可用日期开始填充基础合同名称。我目前正在这样做,如下所示:
adjContracts <- merge(uContracts, tW, fill = na.locf)
上面的命令适用于数字数据(例如价格),但适用于字符数据。我当前的输出是:
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_), .Dim = c(21L, 3L), .Dimnames = list(NULL,
c("SP00.USA", "SP.1.USA", "SP.2.USA")), index = structure(c(946598400,
946857600, 946944000, 947030400, 947116800, 947203200, 947462400,
947548800, 947635200, 947721600, 947808000, 948067200, 948153600,
948240000, 948326400, 948412800, 948672000, 948758400, 948844800,
948931200, 949017600), tzone = "UTC", tclass = "Date"), class = c("xts",
"zoo"), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC")
根据我的收集,xts正在将基础数据集转换为数字(从字符)。我相信,merge.xts not merging all data using R中的达伦·库克(Darren Cook)(PS-希望您对大喊大叫表示满意)谈到了此问题,但我不确定如何在此处应用它。
任何帮助将不胜感激。
干杯,S
更新:以下是预期的输出(请注意xts对象的索引之间的差异):
structure(c("SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA", "SPH00-USA",
"SPH00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA",
"SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA",
"SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA",
"SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA", "SPM00-USA",
"SPM00-USA"), .Dim = c(20L, 3L), .Dimnames = list(NULL, c("SP00-USA",
"SP.1-USA", "SP.2-USA")), index = structure(c(946598400, 946857600,
946944000, 947030400, 947116800, 947203200, 947462400, 947548800,
947635200, 947721600, 947808000, 948067200, 948153600, 948240000,
948326400, 948412800, 948672000, 948758400, 948844800, 948931200
), tzone = "UTC", tclass = "Date"), class = c("xts", "zoo"), .indexCLASS = "Date", tclass = "Date", .indexTZ = "UTC", tzone = "UTC")
也许有一种无需转换数据即可解决此问题的方法,但是如果将其转换为数据框,则操作起来会更容易。使用tidyverse
中的函数,我们可以执行以下操作
library(tidyverse)
library(xts)
as.data.frame(uContracts) %>%
rownames_to_column('Date') %>%
mutate(Date = as.Date(Date)) %>%
right_join(tibble(Date = tW)) %>%
fill(everything()) %>%
column_to_rownames('Date') %>%
as.xts()
# SP00-USA SP.1-USA SP.2-USA
#1999-12-31 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-03 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-04 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-05 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-06 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-07 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-10 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-11 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-12 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-13 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-14 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-17 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-18 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-19 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-20 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-21 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-24 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-25 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-26 "SPH00-USA" "SPH00-USA" "SPM00-USA"
#2000-01-27 "SPH00-USA" "SPH00-USA" "SPM00-USA"
从问题中显示的预期输出来看,结果中似乎只有tW
中的日期。在这种情况下,将tW
转换为xts对象,使用指示的all=
参数执行合并,然后应用na.locf
。
na.locf(merge(uContracts, xts(, tW), all = c(FALSE, TRUE)))
((如果要同时将tW
和uContacts
中的所有日期都显示在输出中,请改用all = TRUE
。]