Comment prélever de nombreux échantillons de 10 sur une grande liste, sans remplacement global

12

J'ai un grand ensemble de données (20 000 points de données), à partir duquel je veux prélever des échantillons répétés de 10 points de données. Cependant, une fois que j'ai sélectionné ces 10 points de données, je veux qu'ils ne soient plus sélectionnés.

J'ai essayé d'utiliser la samplefonction, mais il ne semble pas avoir une option d'échantillonnage sans remplacement sur plusieurs appels de la fonction. Existe-t-il un moyen simple de procéder?

robintw
la source

Réponses:

9

Vous pouvez appeler sample une fois sur l'ensemble de données pour le permuter. Ensuite, lorsque vous voulez obtenir un échantillon, vous pouvez saisir les 10 premiers. Si vous voulez un autre échantillon, saisissez les 10 suivants. Et ainsi de suite.

Dason
la source
9

La pensée de Dason, mise en œuvre dans R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample
conjugateprior
la source
(+1) Code R vraiment soigné. Il est à noter que cela ne fonctionnera pas si est impair. n
chl
@chl Merci! Mais je pense que cela fonctionnera. La tâche consistait à donner des échantillons de taille 10 à partir d'un ensemble de points de données. Supposons que n = longueur (points de données). Le code donne le nombre maximum (n% /% 10) de tels échantillons. Le premier cas de coin est n <10 (de toute façon exclu dans l'énoncé du problème en décrivant l'ensemble de données comme «grand», c'est-à-dire n> 10). Dans ce cas, vous récupérez les points de données et un avertissement (pas une erreur). Le deuxième cas d'angle est s'il y a des éléments pendantes (quand n %% 10! = 0). Ensuite, vous obtenez autant d'échantillons que possible et un avertissement (pas une erreur). Les situations n impaires sont subsumées dans l'un de ces deux cas.
conjugateprior
Il semble que le premier élément de la liste soit de longueur 11, et non 10, et sum(unlist(lapply(sample, length)))renvoie la longueur de datapoints(que j'ai définie à 1001).
chl
@chl Damn! Tu as plutot raison.
conjugateprior
2

Cela devrait fonctionner:

x <- rnorm(20000)
x.copy <- x
samples <- list()
i <- 1
while (length(x) >= 10){
    tmp <- sample(x, 10)
    samples[[i]] <- tmp
    i <- i+1
    x <- x[-match(tmp, x)]
}

table(unlist(samples) %in% x.copy)

Cependant, je ne pense pas que ce soit la solution la plus élégante ...

Bernd Weiss
la source
1

@conjugateprior Votre réponse va dans la bonne direction. Mais au moins pour ma version R actuelle 3.4.3, cela ne fonctionne pas. Cependant, avec quelques ajustements, cela fonctionne:

mysample<-split(sample(length(datapoints)), 1:10)
mysample[[9]] ## the ninth sample

Comme je ne peux pas encore commenter, j'ai choisi de répondre ici.

5e
la source