R:生成矩阵而不是列表

时间:2018-03-19 23:04:43

标签: r

我有一个非常简单的代码,可以生成K-fold交叉验证的培训和测试集。 我有一个矩阵 X [20x15],如果我采用折叠次数n_folds,例如10我得到矩阵trainingData [18x15]和testData [2x15]这是正确的。

现在,如果我更改了折叠次数n_folds=20,我会选择trainingData [19x15]这是正确的,但对于testData,R会生成一个列表,而不是矩阵[1x15]。当我使用as.matrix函数时,它生成一个[15x1]矩阵而不是[1x15]。

以下是n_fold=20的代码:

library(dplyr)
library(tidyr)
require(stats)
set.seed(19875)
n=20
p=15
real_p=15
x=matrix(rnorm(n*p), nrow=n, ncol=p)
n_folds=20
  #Randomly shuffle the data 
  x=x[sample(nrow(x)),]
  folds=cut(seq(1, nrow(x)), breaks = n_folds, labels = FALSE)
  #Perform 10 fold cross validation 
  for(i in 1:n_folds){
    #segment your data by folds using the which() function 
    testIndexes=which(folds==i, arr.ind = TRUE)
    testData=x[testIndexes,]
    trainData=x[-testIndexes,]
  }

testData生成矩阵的最简单方法是矩阵[1x15]而不是列表?

2 个答案:

答案 0 :(得分:1)

这里的问题是你要提取行,而你只有一行,所以你得到了一个向量。要强制执行矩阵,请使用对矩阵的调用。您对矩阵调用的初始尝试使用了构造矩阵的默认方式,该方法生成单个列。指定列和行的内容。我假设您希望维度为length(testIndexes) p,但如果它是其他内容,您可以将其用作正确答案的形式。只需按照你想要的那样。

set.seed(19875)
n=20
p=15
real_p=15
x=matrix(rnorm(n*p), nrow=n, ncol=p)
n_folds=20
#Randomly shuffle the data 
x=x[sample(nrow(x)),]
folds=cut(seq(1, nrow(x)), breaks = n_folds, labels = FALSE)
#Perform 10 fold cross validation 
for(i in 1:n_folds){
  #segment your data by folds using the which() function 
  testIndexes=which(folds==i, arr.ind = TRUE)
  testData=matrix(x[testIndexes,], length(testIndexes), p)
  trainData=x[-testIndexes,]
}

答案 1 :(得分:1)

我重新编写了你的​​代码并想出了这个,我希望它有用:

library ( dplyr )
library ( tidyr )
library ( stats )
library ( magrittr )

set.seed ( 19875 )

N <- 20
P <- 15

X <- matrix ( rnorm ( N * P ), N )
N_Folds <- 5

Folds <- rep ( 1:N_Folds, l = N ) %>% sample

for ( Fold in 1:N_Folds ){
  Validation <- which ( Fold == Folds )
  Valid_Data <- X [ Validation,, drop = FALSE ]
  Train_Data <- X [ -Validation,, drop = FALSE ]
}

Train_Data %>% dim
Valid_Data %>% dim

大卫