ti-enxame.com

Amostra aleatória de uma porcentagem de linhas em um quadro de dados

Relacionado à questão this .

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 ), ]

Em vez de selecionar um número de linhas (3 no caso acima), como posso selecionar aleatoriamente 20% das linhas com "F"? Portanto, das cinco linhas com "F", como faço para amostrar aleatoriamente 20% dessas linhas.

17
ATMathew

Que tal agora:

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

Onde 0,2 é o seu 20% e length(which(mydf$gender=='F')) é o número total de linhas com F

14
Ben

Você pode usar a função sample_frac() no pacote dplyr.

por exemplo. Se você quiser experimentar 20% de cada grupo:

mydf %>% sample_frac(.2)

Se você quiser experimentar 20% de cada grupo de gênero:

mydf %>% group_by(gender) %>% sample_frac(.2)
15
Zhen Liang

Alerta de autopromoção. Escrevi uma função que permite amostragem estratificada conveniente e incluí uma opção para subconjunto de níveis das variáveis ​​de agrupamento antes da amostragem.

A função é chamada stratified e pode ser usada das seguintes maneiras:

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

Você pode especificar vários grupos (por exemplo, se seu quadro de dados incluísse uma variável "state" e desejasse agrupar por "state" e "gender", você especificaria group = c("state", "gender")). Você também pode especificar vários argumentos "selecionar" (por exemplo, se desejar apenas entrevistadas do sexo feminino da Califórnia e do Texas, e sua variável "state" usar abreviações de estado de duas letras, poderá especificar select = list(gender = "F", state = c("CA", "TX"))).

A função em si pode ser encontrada aqui ou você pode baixar e instalar o pacote (que oferece acesso conveniente às páginas de ajuda e exemplos) usando install_github Do pacote "devtools" como segue:

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

Para obter uma amostra de 20%, você pode usar isso para obter o tamanho da amostra:

n = round(0.2 * nrow(mydf[mydf$gender == "F",]))
2
Paul Hiemstra