2015-10-15 69 views
1

我在如何對存儲在列表中的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可能會有所幫助,但我不能把它翻譯成我的問題...

任何提示是非常感謝!

回答

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) 
+0

謝謝@ '約書亞烏爾裏希',這也解決了我的問題。我意識到子類化元素的類型有什麼不同:'createDataPartition'用行索引創建一個數值向量,而你的解決方案創建一個邏輯向量(TRUE/FALSE) - 這似乎很重要。 – Stephan

+0

@Stephan:無論'trainIndex'是數字還是邏輯都不重要。你可以通過任何一個子類來對子對象進行分類你可以通過'lapply(trainIndex,which)'來轉換我的'trainIndex',當你使用它創建'series.test'時,你會得到相同的結果。 –

相關問題