R getSplits(quantmod)导入的矩阵根据符号以不同的方式成形

R getSplits(quantmod)导入的矩阵根据符号以不同的方式成形,r,quantmod,R,Quantmod,我正在尝试导入股票数据(拆分),但我遇到了一个问题。 如果所有符号都包含拆分,则没有问题。但是,当其中一个没有拆分时,矩阵以不同的方式成形,并且是错误的 以下是我使用的代码: library(quantmod) Tick <- c("AA","ARGO") split_test <- Reduce(merge, lapply(Tick, function(x) { tryCatch({ getSplits(x, from= &q

我正在尝试导入股票数据(拆分),但我遇到了一个问题。 如果所有符号都包含拆分,则没有问题。但是,当其中一个没有拆分时,矩阵以不同的方式成形,并且是错误的

以下是我使用的代码:

library(quantmod)

Tick <- c("AA","ARGO")

split_test <- Reduce(merge, lapply(Tick, function(x) {
  tryCatch({
    getSplits(x, from= "2016-01-04", to="2017-03-09", src="yahoo")
  }, error = function(e) {}
  )
}))
问题是,如果勾选中包含没有拆分的“A”,则结果会完全不同,而且是错误的:

Tick <- c("A","AA","ARGO")

     x     AA.spl         ARGO.spl
1    N/A    3.000         0.9091
2    N/A    0.801         0.9091
分红
勾选
getSplits()
只返回“A”的
NA
,而不是xts对象。在
勾选
向量中,“A”是第一个,因此不会调用xts对象的
merge()
方法(因为S3方法分派是如何工作的)

您可以使用
cbind()
而不是
merge()
,因为
cbind()
的方法分派工作方式不同。但我不建议这样的解决方案,因为你不太可能记得这两个函数之间的细微差别

相反,我会在合并之前预处理您的拆分列表

split_test <-
  lapply(Tick,
         function(x) {
           try(getSplits(x, from= "2016-01-04", to="2017-03-09", src="yahoo"),
               silent = TRUE)
         })
names(split_test) <- Tick

# convert NA to xts object with date < 1900
split_test <-
  lapply(split_test,
         function(x) {
           if (identical(x, NA)) xts(NA, .Date(-4e4)) else x
         })

# merge and remove pre-1900 date
split_test <- Reduce(merge, split_test)["1900/"]
# set names
names(split_test) <- Tick

split_test
##               AA  A      ARGO
## 2016-05-27    NA NA 0.9090909
## 2016-10-06 3.000 NA        NA
## 2016-11-01 0.801 NA        NA

现在在
lappy()
调用中使用此函数,并执行相同的
Reduce()
调用。然后,如果需要,您可以再次设置名称

Test <- lapply(Test, fill_missing)
out <- Reduce(merge, Test)["1900/"]
out <- out[,Tick]

Test我没有得到与所示相同的输出。我得到的列名为
x..I..
,包含所有
NA
,其他列的值不重复。真的吗?我只是又累了“不管它值多少钱,我不喜欢这种行为。对我来说,使用“零长度”xts对象更有意义。这是目前不可能的,以前也讨论过,但我还没有时间去做。哇!你救了我。非常感谢你!我试着用你写的代码来获得红利。我认为它应该和getSplits一样,但当我运行测试时,并没有股息的股票并没有显示出来。很抱歉,我的反应太慢了。我不经常检查。看我的编辑。非常感谢!很抱歉,我正在努力使用GetDistributions和getSplits。如您所知,如果某些符号无效,则会发生错误;“句柄已在其他地方使用”。我在gitHub上读了你的帖子“getSymbols.yahoo warnings#307”。你说我们应该让它跳过一个无效的符号,并成功获得下一个有效的符号。很抱歉,我不知道该怎么做。你能给我一些想法吗?
Tick <- c("A","AA","AADR","AAN","AAP","AAT")

Test <-
  lapply(Tick,
         function(x) {
           try(getDividends(x, from= "2016-01-04", to="2016-03-15", src="yahoo"),
               silent = TRUE)
         })
names(Test) <- Tick

# convert NA to xts object with date < 1900
Test <-
  lapply(Test,
         function(x) {
           if (identical(x, NA)) xts(NA, .Date(-4e4)) else x
         })

# merge and remove pre-1900 date
Test <- Reduce(merge, Test)["1900/"]
split_test <-
  lapply(Tick,
         function(x) {
           try(getSplits(x, from= "2016-01-04", to="2017-03-09", src="yahoo"),
               silent = TRUE)
         })
names(split_test) <- Tick

# convert NA to xts object with date < 1900
split_test <-
  lapply(split_test,
         function(x) {
           if (identical(x, NA)) xts(NA, .Date(-4e4)) else x
         })

# merge and remove pre-1900 date
split_test <- Reduce(merge, split_test)["1900/"]
# set names
names(split_test) <- Tick

split_test
##               AA  A      ARGO
## 2016-05-27    NA NA 0.9090909
## 2016-10-06 3.000 NA        NA
## 2016-11-01 0.801 NA        NA

fill_missing <-
function(x)
{
    y <- x
    if (identical(x, NA) || length(x) < 1) {
        y <- xts(NA, .Date(-4e4))
    }
    y
}
Test <- lapply(Test, fill_missing)
out <- Reduce(merge, Test)["1900/"]
out <- out[,Tick]