Come prelevare molti campioni da 10 da un ampio elenco, senza sostituzione complessiva


12

Ho una grande serie di dati (20.000 punti dati), da cui desidero prelevare campioni ripetuti di 10 punti dati. Tuttavia, una volta scelti quei 10 punti dati, voglio che non vengano raccolti di nuovo.

Ho provato a utilizzare la samplefunzione, ma non sembra avere un'opzione per campionare senza sostituzione su più chiamate della funzione. C'è un modo semplice per fare questo?

Risposte:


9

È possibile chiamare il campione una volta sull'intero set di dati per permetterlo. Quindi, quando vuoi ottenere un campione, puoi prendere il primo 10. Se vuoi un altro campione, prendi il prossimo 10. E così via.


9

Il pensiero di Dason, implementato in R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample

n

@chl Grazie! Ma penso che funzionerà. Il compito era quello di fornire campioni di dimensioni 10 da una serie di punti dati. Supponiamo n = lunghezza (punti dati). Il codice fornisce il numero massimo (n% /% 10) di tali campioni. Il primo caso d'angolo è n <10 (comunque escluso nella dichiarazione del problema descrivendo il set di dati come 'grande', cioè n> 10). In tal caso, vengono restituiti i punti dati e un avviso (non un errore). Il secondo caso d'angolo è se ci sono elementi pendenti (quando n %% 10! = 0). Quindi ottieni il maggior numero possibile di campioni e un avviso (non un errore). In uno di questi due casi vengono riassunte le situazioni dispari.
conjugateprior

Sembra che il primo elemento dell'elenco sia di lunghezza 11, non 10, e sum(unlist(lapply(sample, length)))restituisca la lunghezza di datapoints(che ho impostato su 1001).
chl

@chl Damn! Hai ragione.
conjugateprior

2

Questo dovrebbe funzionare:

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)

Tuttavia, non penso che sia la soluzione più elegante ...


1

@conjugateprior La tua risposta sta andando nella giusta direzione. Ma almeno per la mia attuale R-versione 3.4.3, non funziona. Tuttavia, con alcune modifiche funziona:

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

Dal momento che non posso ancora commentare ho scelto di rispondere qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.