根据行索引列表对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)
谢谢@ '约书亚乌尔里希',这也解决了我的问题。我意识到子类化元素的类型有什么不同:'createDataPartition'用行索引创建一个数值向量,而你的解决方案创建一个逻辑向量(TRUE/FALSE) - 这似乎很重要。 – Stephan
@Stephan:无论'trainIndex'是数字还是逻辑都不重要。你可以通过任何一个子类来对子对象进行分类你可以通过'lapply(trainIndex,which)'来转换我的'trainIndex',当你使用它创建'series.test'时,你会得到相同的结果。 –