【问题标题】:Subsetting a list of xts based on list of row indexes根据行索引列表对 xts 列表进行子集化
【发布时间】:2016-01-14 11:00:59
【问题描述】:

我正在努力解决如何对存储在列表中的 xts 对象进行子集化的问题。 子集应基于行索引发生。背景是我想将对象随机 80/20 分成训练集和测试集。 这是一个例子:

library(xts)

# Create a sample list with dummy data
series <- list(
  A=xts(rnorm(n=200), as.Date("2015-01-01")+1:200),
  B=xts(rnorm(n=50), as.Date("2015-04-01")+1:50)
)

注意:这些 xts 对象的长度是故意不同的。

trainIndex 是一个包含行号的列表,根据 caret 包中的 createDataPartition 函数将每个 xts 对象按 80/20 比例拆分:

# create am index of row numbers for splitting the dataset
library(caret)
trainIndex <- lapply(series, function(x) {createDataPartition(x, p=0.8)})

这就是我期望的工作:

series.test <- lapply(series, function(x) x[trainIndex,])

它没有。

这适用于“静态”向量(根据 here):

trainIndex.simple <- seq(1,50,by=3)
lapply(series, function(x) x[trainIndex.simple,])

这适用于一个列表元素

series$A[trainIndex$A[[1]],]

但是如何将行索引列表应用于 xts 对象列表? This post 可能会有所帮助,但我无法将其转化为我的问题...

非常感谢任何提示!

【问题讨论】:

    标签: r xts


    【解决方案1】:

    您需要使用一个同时遍历两个列表的函数。例如:mapply,或Map(调用mapply):

    set.seed(21)
    trainIndex <- lapply(series, function(x)
      sample(c(TRUE,FALSE), nrow(x), TRUE, c(0.8, 0.2)))
    series.test <- mapply(function(x, i) x[i,], x=series, i=trainIndex)
    series.test <- Map(function(x, i) x[i,], x=series, i=trainIndex)
    

    【讨论】:

    • 感谢@'Joshua Ulrich',这确实解决了我的问题。我意识到子集元素的类型有所不同:createDataPartition 创建一个带有行索引的数字向量,而您的解决方案创建一个逻辑向量 (TRUE/FALSE) - 这似乎很重要。
    • @Stephan:trainIndex 是数字还是逻辑无关紧要。您可以通过其中任何一个来子集 xts 对象。您可以通过lapply(trainIndex, which) 转换我的trainIndex,当您使用它创建series.test 时,您将获得相同的结果。
    猜你喜欢
    • 2017-12-13
    • 1970-01-01
    • 2019-11-08
    • 2015-11-27
    • 2013-04-22
    • 2012-08-06
    • 2020-09-09
    • 2020-08-19
    • 2020-10-29
    相关资源
    最近更新 更多