给定跟踪器名称的向量,例如:datanames = c("A", "B", "C", "D", "E")
我使用此向量从.csv收集数据并将其放入以跟踪器命名的数据帧列表中。
for (stocks in datanames)
{
stockdfs[[stocks]] = mycsv[mycsv$tracker == stocks,]
}
这完全没问题。
我现在正在尝试将此列表转换为包含xts对象的列表,以便我可以对其进行一些时间序列分析。因此我补充说:
row.names(stockdfs[[stocks]]) = stockdfs[[stocks]]$Date #xts requirement
##BELOW IS WHERE THE PROBLEM LIES##
stockxts[[stocks]] = as.xts(stockdfs[[stocks]])
stockinsampxts[[stocks]] = as.xts(stockdfs[[stocks]][0:2000,])
stockoutsampxts[[stocks]] = as.xts(stockdfs[[stocks]][2000:nrow(stockdfs[[stocks]]),])
print(stocks)
问题是,当我尝试查看列表中的xts对象时,我得到:
Error in names[[i]] : subscript out of bounds
奇怪的是,我仍然可以从控制台访问数据,例如print(stockxts [[“A”]])。
非常感谢帮助,我是一个R新手!谢谢!
有两种创建xts对象的方法,一种是通过创建row.names而另一种是使用as.xts
函数中的order.by选项。
但是您应该意识到您没有从数据中删除日期列。 xts数据是一个矩阵,如果包含日期,矩阵中的所有内容都是一个字符。
在您的rownames语句之后,您可以执行以下操作来删除日期:
stockdfs[[stocks]]$Date <- NULL
然后stockxts[[stocks]] = as.xts(stockdfs[[stocks]])
将以数字形式获得xts数据(只要其他列中没有其他字符值)。
在以下示例中删除日期或保留日期时,您可以看到结果的差异:
A <- data.frame(Date = seq(as.Date("2018-02-01"), as.Date("2018-02-05"), by = "day"),
val1 = seq(1:5))
# everything a character
as.xts(A, order.by = A$Date)
Date val1
2018-02-01 "2018-02-01" "1"
2018-02-02 "2018-02-02" "2"
2018-02-03 "2018-02-03" "3"
2018-02-04 "2018-02-04" "4"
2018-02-05 "2018-02-05" "5"
# Everything numeric
as.xts(A[, -which(names(A) == "Date")], order.by = A$Date)
[,1]
2018-02-01 1
2018-02-02 2
2018-02-03 3
2018-02-04 4
2018-02-05 5