R: Random amostragem um número par de observações de uma série de categorias

votos
2

Eu já tomou uma amostra aleatória de códigos postais do meu trama de dados e, em seguida, percebi que eu não estava amostragem em todas as unidades estatísticas de nível superior. Eu tenho cerca de 1 milhão de códigos postais e 7000 unidades estatísticas de saída do meio. Eu quero a amostra ter aproximadamente o mesmo número de códigos postais de cada unidade estatística.

Como posso provar aleatoriamente 35 códigos postais de cada unidade estatística nível superior?

I usado o seguinte código anteriormente para provar aleatoriamente 250.000 códigos postais:

total.sample <- total[sample(1:nrow(total), 250000,
                           replace=FALSE),] 

Como especifico uma cota amostra aleatória de códigos postais com base na outra variável de coluna (por exemplo, tal como a unidade de maior nível estatístico (ver msoa.rank na estrutura de trama de dados abaixo))?

stucture Base de dados:

'data.frame':   1096289 obs. of  25 variables:
$ pcd                : Factor w/ 986055 levels AL100AB,AL100AD,..: 282268 282258 
$ mbps2              : int  0 1 0 0 0 1 0 0 0 0 ...
$ averagesp          : num  16 7.8 7.8 9.5 9.4 3.2 11.1 19.4 10.5 11.8 ...
$ mediansp           : num  18.2 8 7.8 8.1 8.5 3.2 8.1 18.7 9.7 8.9 ...
$ nga                : int  0 0 0 0 0 0 0 0 0 0 ...
$ x                  : int  533432 532192 533416 533223 532866 531394 532899 532744 
$ total.dps          : int  11 91 10 7 9 10 3 5 21 12 ...
$ connections.density: num  7.909 0.747 3.1 7.714 1.889 ...
$ urban              : int  1 1 1 1 1 1 1 1 1 1 ...
$ gross.pay          : num  36607 36607 36607 36607 36607 ...
$ p.tert             : num  98.8 98.8 98.8 98.8 98.8 ...
$ p.kibs             : num  70.3 70.3 70.3 70.3 70.3 ...
$ density            : num  25.5 25.5 25.5 25.5 25.5 25.5 25.5 25.5 25.5 25.5 ...
$ p_m_s              : num  93.5 93.5 93.5 93.5 93.5 ...
$ p_m_l              : num  6.52 6.52 6.52 6.52 6.52 ...
$ p.edu              : num  62.6 62.6 62.6 62.6 62.6 ...
$ p.claim            : num  1.58 1.58 1.58 1.58 1.58 ...
$ p.non.white        : num  21.4 21.4 21.4 21.4 21.4 21.4 21.4 21.4 21.4 21.4 ...
$ msoa.rank          : int  2 2 2 2 2 2 2 2 2 2 ...
$ oslaua.rank        : int  321 321 321 321 321 321 321 321 321 321 ...
$ nuts2.rank         : int  22 22 22 22 22 22 22 22 22 22 ...
$ gor.rank           : int  8 8 8 8 8 8 8 8 8 8 ...
$ cons               : int  1 1 1 1 1 1 1 1 1 1 ...

pcd = código postal

msoa.rank = a variável ordinal de cada unidade estatística saída meio

Publicado 30/06/2014 em 22:17
fonte usuário
Em outras línguas...                            


2 respostas

votos
2

Isso é fácil , esperamos em breve ser fixado na dplyr(graças, @Henrik!)

library(dplyr)
yourSample <- yourData %>%
    group_by(msoa.rank) %>%
    sample_n(size = 35) # currently buggy

Até então, aqui está uma solução alternativa, (graças a @beginneR)

yourSample <- yourData %>%
    group_by(msoa.rank) %>%
    do(sample_n(., size = 35))

ou ficar com velho liso plyrpara o agrupamento.

library(plyr)
yourSample <- ddply(yourData, "msoa.rank", .fun = function(x) {sample_n(x, size = 35)})
Respondeu 30/06/2014 em 23:49
fonte usuário

votos
1

Será que cada msoa.rank ter pelo menos 35 códigos postais? Isso vai ser rápido comdata.table

#Create a data.table object
require(data.table)
total <- data.table(total)

#Sample by each msoa.rank group (take a sample that is size min(35,total size of msoa grp)
total.sample <- total[ , .SD[sample(1:.N,min(35,.N))], by=msoa.rank]

Então aqui está como exemplo iria trabalhar usando o clássico irisconjunto de dados.

iris < data.table(iris)
set.seed(2014)
iris.sample <- iris[ , .SD[sample(1:.N,min(10,.N))], by=Species]
summary(iris.sample$Sepal.Length)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
4.400   5.000   5.850   5.797   6.525   7.200 

Aqui está outro exemplo e resumo para ver a diferença

iris.sample2 <- iris[ , .SD[sample(1:.N,min(10,.N))], by=Species]
summary(iris.sample2$Sepal.Length)

Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
4.400   5.100   5.850   5.743   6.275   7.300 
Respondeu 01/07/2014 em 07:21
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more