【问题标题】:Converting list of dataframes to list of xts objects turns data into characters - unable to access [in R]将数据帧列表转换为 xts 对象列表将数据转换为字符 - 无法访问 [在 R 中]
【发布时间】:2018-09-16 19:36:52
【问题描述】:

给定一个跟踪器名称向量,例如: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】:

    有两种方法可以创建 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
    

    【讨论】:

    • 非常感谢!这很有意义。因此,在转换之前从数据框中删除任何非数字的内容。这完全解决了我使用 xts 对象添加和减去数据的问题。您对访问列表中的 xts 对象有任何想法吗?我不断收到“名称错误[[i]]:下标超出范围”,尽管如果我执行类似“test = stockxts[["A"]]”这样的操作能够访问 xts 对象。
    • test = stockxts[["A"]] 之后检查names(test)。您可能在 xts 转换中丢失了 A data.frame 的名称。在这种情况下,您需要再次添加它们。
    • 这很奇怪 - 如果我输入 View(stockxts[["A"]]) 它可以工作,我只是无法从 GUI 中打开它而不会出现错误。名称中没有错误。我想这不是最重要的交易,所以再次感谢!
    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 2014-05-17
    • 2016-01-07
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多