2012-12-21 15 views
12

Ho un vettore con lunghezza variabile, che a volte può essere di lunghezza 1.Campionamento in R dal vettore di lunghezza variabile

desidero campionare da questo vettore tale che se la sua lunghezza è 1 passa sempre campioni 1 numero.

campione() non sarà fare questo perché i campioni da 1 a cifra quando la dimensione del campione è 1.

+6

La risposta per questa domanda è il file di aiuto per 'sample' vedi'? Sample' e leggi attentamente la sezione 'Details', qui puoi trovare 'Se x ha lunghezza 1, è numerico (nel senso di is. numerico) e x> = 1, il campionamento tramite il campione ha luogo da 1: x' –

+2

e c'è un modo per farlo campionare solo quel singolo valore? – user1723765

risposta

14

Questa è una caratteristica documentata:

Se x ha lunghezza 1, è numeric (nel senso di is.numeric) e x >= 1, il campionamento tramite campione avviene da 1:x. Si noti che questa funzione di comodità può comportare un comportamento indesiderato quando x è di lunghezza variabile in chiamate come sample(x).

Un'alternativa è quella di scrivere la propria funzione per evitare la funzione:

sample.vec <- function(x, ...) x[sample(length(x), ...)] 
sample.vec(10) 
# [1] 10 
sample.vec(10, 3, replace = TRUE) 
# [1] 10 10 10 

Alcune funzioni con un comportamento simile sono elencati sotto seq vs seq_along. When will using seq cause unintended results?

+0

Abbiamo pubblicato la stessa risposta nello stesso momento apparentemente. Quindi ho spostato la mia risposta all'altra domanda identica e ho votato per chiudere le due domande. –

+0

Grazie @Joris. Pensavo che la mia risposta avesse un po 'di più del tuo quindi sentiti libero di salvarti se sei d'accordo. Preferirei aver chiuso quello più recente, ma non so se esiste una politica in questi casi. – flodel

+1

Ho già sviato il tuo :). Ho contrassegnato la domanda per la fusione, quindi quando ciò accade tutte le risposte vengono sommate. Intendevo chiudere l'altro, ma a quanto pare ho fatto clic su "vota per chiudere" nella finestra sbagliata. Errore mio, mi dispiace –

15

Quando alimentato solo un singolo numero, sample opere come sample.int (vedi ?sample). Se si desidera assicurarsi che solo i campioni dal vettore si dà, si può lavorare con gli indici e utilizzare questo costrutto:

x[sample(length(x))] 

Questo ti dà il risultato corretto indipendentemente dalla durata del x, e senza dover aggiungere un if -condizione che controlla la lunghezza.

Esempio:

mylist <- list(
    a = 5, 
    b = c(2,4), 
    d = integer(0) 
) 

mysample <- lapply(mylist,function(x) x[sample(length(x))]) 

> mysample 
$a 
[1] 5 

$b 
[1] 2 4 

$d 
integer(0) 

Nota: è possibile sostituire sample da sample.int per ottenere un piccolo guadagno di velocità.

+3

+1 per la soluzione di gran lunga più elegante qui. – Thilo

Problemi correlati