R:生成矩阵而不是列表

jjjwad0x  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(160)

我有一个非常简单的代码,可以生成一个用于K重交叉验证的训练集和测试集。我有一个矩阵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],而不是列表),最简单的方法是什么?

eqqqjvef

eqqqjvef1#

这里的问题是,您提取的是行,而只有一行,因此您得到的是一个向量。要强制执行矩阵,请调用matrix。您最初尝试调用matrix时使用的是构造矩阵的默认方式,这将生成一个单列。请指定所需的列和行。I'我假设你想要的维度是length(testIndexes) x x,但是如果是其他的,你可以用这个作为正确答案的形式,只要把你想要的代入就行了。

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,]
}
hjzp0vay

hjzp0vay2#

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

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

大卫

相关问题