5 votes

Diviser un vecteur en trois vecteurs de longueur inégale dans R

Une question d'un n00b relatif : Je voudrais diviser un vecteur en trois vecteurs de longueurs différentes, avec les valeurs assignées à chaque vecteur au hasard. Par exemple, je voudrais diviser le vecteur de longueur 12 ci-dessous en vecteurs de longueur 2, 3 et 7.

Je peux obtenir trois vecteurs de taille égale en utilisant ceci :

test<-1:12
split(test,sample(1:3))

Avez-vous des suggestions sur la façon de diviser le test en vecteurs de 2, 3 et 7 au lieu de trois vecteurs de longueur 4 ?

12voto

Dason Points 18263

Vous pourriez utiliser rep pour créer les indices de chaque groupe et ensuite les diviser en fonction de cela.

split(1:12, rep(1:3, c(2, 3, 7)))

Si vous vouliez que les éléments soient assignés de manière aléatoire afin que ce ne soit pas seulement les 2 premiers éléments du premier vecteur, les 3 suivants du second vecteur, ..., vous pourriez simplement ajouter un appel à sample

split(1:12, sample(rep(1:3, c(2, 3, 7))))

Si vous n'avez pas de longueurs spécifiques (2, 3, 7) en tête mais que vous ne voulez pas que les vecteurs soient de longueur égale à chaque fois, la réponse de SimonO101 est la bonne.

5voto

Simon O'Hanlon Points 27680

Que diriez-vous d'utiliser sample un peu différemment...

set.seed(123)
test<-1:12
split( test , sample(3, 12 , repl = TRUE) )

#$`1`
#[1] 1 6

#$`2`
#[1]  3  7  9 10 12

#$`3`
#[1]  2  4  5  8 11

set.seed(1234)
test<-1:12
split( test , sample(3, 12 , repl = TRUE) )

#$`1`
#[1] 1 7 8

#$`2`
#[1]  2  3  4  6  9 10 12

#$`3`
#[1]  5 11

Le premier argument dans sample est le nombre de groupes dans lesquels diviser le vecteur. Le second argument est le nombre d'éléments dans le vecteur. Ceci va assigner aléatoirement chaque élément successif dans l'un des 3 vecteurs. Pour 4 vecteurs, il suffit de faire split( test , sample(4, 12 , repl = TRUE) ) .

1voto

theLudo Points 117

C'est plus facile que vous ne le pensez. Pour diviser le vecteur en trois nouveaux ensembles choisis au hasard, exécutez le code suivant :

test <- 1:12
split(sample(test), 1:3)

Ainsi, chaque fois que vous exécutez ce code, vous obtenez une nouvelle distribution aléatoire dans trois ensembles différents (parfait pour la validation croisée k-fold).

Vous obtenez :

> split(sample(test), 1:3)
$`1`
[1] 5 8 7 3

$`2`
[1]  4  1 10  9

$`3`
[1]  2 11 12  6

> split(sample(test), 1:3)
$`1`
[1] 12  6  4  1

$`2`
[1] 3 8 7 5

$`3`
[1]  9  2 10 11

0voto

darmat Points 188

Vous pourriez utiliser un vecteur auxiliaire pour formater la façon dont vous voulez diviser vos données. Exemple :

Data <- c(1,2,3,4,5,6)

Format <- c("X","Y","X","Y","Z,"Z")

output <- split(Data,Format)

Générera la sortie :

$X
[1] 1 3

$Y
[1] 2 4

$Z
[1] 5 6

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X