2013-02-22 16 views
10

Correlato a this domanda.Campione casuale di una percentuale di righe all'interno di un riquadro dati

gender <- c("F", "M", "M", "F", "F", "M", "F", "F") 
age <- c(23, 25, 27, 29, 31, 33, 35, 37) 
mydf <- data.frame(gender, age) 

mydf[ sample(which(mydf$gender=='F'), 3), ] 

Invece di selezionare un numero di righe (3 nel caso di cui sopra), come posso selezionare casualmente il 20% di righe con "F"? Quindi delle cinque righe con "F", come posso campionare a caso il 20% di quelle righe.

risposta

11

ne dite di questo:

mydf[ sample(which(mydf$gender=='F'), round(0.2*length(which(mydf$gender=='F')))), ] 

Dove 0.2 è il vostro 20% e length(which(mydf$gender=='F')) è il numero totale di righe con F

+2

+1, ma ti dispiace che il 20% può essere qualcosa di diverso di un numero intero, quindi sarebbe necessario utilizzare il round. –

+1

buon punto, grazie, l'ho aggiunto. A proposito, ti manca una virgola e chiudi parentesi quadra nella tua risposta – Ben

1

Per campionare il 20%, è possibile utilizzare questo per ottenere la dimensione del campione:

n = round(0.2 * nrow(mydf[mydf$gender == "F",])) 
+0

Sì, sono stato in grado di farlo ma questo è un file che è automatizzato ed eseguito ogni ora quindi non posso entrare e regolare i valori senza scrivere un'altra funzione con una istruzione if else. Immaginato ci sarebbe un approccio più semplice – ATMathew

+3

Questa è esattamente la risposta alla tua domanda, se la tua domanda è diversa, ti preghiamo di modificare più dettagli. –

+0

Qualcuno si preoccupa di commentare il downvote? Questa risposta risponde esattamente alla domanda. –

2

Avviso di auto-promozione. Ho scritto una funzione che consente un comodo campionamento stratificato e ho incluso un'opzione per suddividere i livelli dalle variabili di raggruppamento prima del campionamento.

La funzione si chiama stratified e può essere utilizzato nei seguenti modi:

set.seed(1) 
# Proportional sample 
stratified(mydf, group="gender", size=.2, select=list(gender = "F")) 
# gender age 
# 4  F 29 
# Fixed-size sampling 
stratified(mydf, group="gender", size=2, select=list(gender = "F")) 
# gender age 
# 4  F 29 
# 5  F 31 

È possibile specificare più gruppi (ad esempio, se la cornice di dati incluso una variabile di "stato" e di voler gruppo da " stato "e" genere "specificare group = c("state", "gender")). È inoltre possibile specificare più argomenti "select" (ad esempio, se si desideravano solo donne intervistate provenienti dalla California e dal Texas e la variabile "stato" utilizzava abbreviazioni di stato a due lettere, è possibile specificare select = list(gender = "F", state = c("CA", "TX"))).

La funzione stessa può essere trovato here o è possibile scaricare e installare il pacchetto (che offre un comodo accesso alle pagine di aiuto e gli esempi) utilizzando install_github dalle "DevTools" pacchetto come segue:

# install.packages("devtools") 
library(devtools) 
install_github("mrdwabmisc", "mrdwab") 
5

È possibile utilizzare la funzione sample_frac() nel pacchetto dplyr.

ad es. Se volete assaggiare il 20% all'interno di ogni gruppo:

mydf %>% sample_frac(.2) 

Se volete assaggiare il 20% all'interno di ogni gruppo genere:

mydf %>% group_by(gender) %>% sample_frac(.2)