根据行索引列表对xts列表进行子集设置

问题描述:

我在如何对存储在列表中的xts对象进行子集化时遇到问题。 子集应基于行索引发生。背景是我想将80/20随机分成训练和测试集。 下面是一个例子:根据行索引列表对xts列表进行子集设置

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是包含拆分每个XTS在80/20的基础对象作为每createDataPartition功能从caret包行号列表:

# 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可能会有所帮助,但我不能把它翻译成我的问题...

任何提示是非常感谢!

您需要使用同时在两个列表上循环的函数。例如: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) 
+0

谢谢@ '约书亚乌尔里希',这也解决了我的问题。我意识到子类化元素的类型有什么不同:'createDataPartition'用行索引创建一个数值向量,而你的解决方案创建一个逻辑向量(TRUE/FALSE) - 这似乎很重要。 – Stephan

+0

@Stephan:无论'trainIndex'是数字还是逻辑都不重要。你可以通过任何一个子类来对子对象进行分类你可以通过'lapply(trainIndex,which)'来转换我的'trainIndex',当你使用它创建'series.test'时,你会得到相同的结果。 –