根据行索引列表子集xts列表

时间:2015-10-15 20:21:44

标签: r xts

我正在努力解决如何对列表中存储的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是一个列表,其中包含根据createDataPartition包中的caret函数按80/20分割每个xts对象的行号:

# 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可能会有所帮助,但我无法将其翻译成我的问题......

非常感谢任何提示!

1 个答案:

答案 0 :(得分:1)

您需要使用同时循环遍历两个列表的函数。例如:mapplyMap(调用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)