将数据帧列表转换为xts对象列表会将数据转换为字符 - 无法访问[在R中]

问题描述 投票:0回答:1

给定跟踪器名称的向量,例如: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新手!谢谢!

r dataframe xts
1个回答
1
投票

有两种创建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
© www.soinside.com 2019 - 2024. All rights reserved.