Dividindo Vetores

Freqüentemente, precisamos dividir um vetor em partes menores de tamanho mais ou menos igual e, subsequentemente, combinar diferentes partes em um vetor de subconjunto. No exemplo abaixo, o método leave-one-out é implementado:

set.seed(42);                             #Same result every time
inputVector
= rnorm(22);
numberOfGroups
= 4;
numberOfElements
= floor(length(inputVector) / numberOfGroups);
groups
= split(inputVector, sample(rep(1:numberOfGroups, numberOfElements)));

for(leaveOutGroup in seq(numberOfGroups)){
trainingPoints
= unlist(groups[-leaveOutGroup], use.names = FALSE);
testPoints
= unlist(groups[leaveOutGroup], use.names = FALSE);
#...
}

Observe que o comprimento do vetor de entrada inicial não precisa ser um múltiplo do número de grupos. No exemplo acima, dois dos quatro grupos terão comprimento seis e R dará um aviso, que pode ser suprimido por:

options(warn=-1)

Se os dados consistirem em mais de um vetor, podemos dividir os índices com a mesma técnica e, em seguida, usá-los para escolher as respectivas entradas dos vetores de interesse:

options(warn = -1);
set.seed(42);

inputVector
= rnorm(22);
outputVector
= rnorm(length(inputVector));
indexVector
= seq(length(inputVector));

numberOfGroups
= 4;
numberOfElements
= floor(length(inputVector) / numberOfGroups);
indexGroups
= split(indexVector, sample(rep(1:numberOfGroups, numberOfElements)));

for(leaveOutGroup in seq(numberOfGroups)){
training
= unlist(indexGroups[-leaveOutGroup], use.names = FALSE);
test
= unlist(indexGroups[leaveOutGroup], use.names = FALSE);
#...
}

A função R amostra faz a amostragem aleatória e recolher o objecto fator que contém os grupos usando não listados , com use.names definidos para falsa.

Tagged