2014-06-30 2 views
2

이전에 데이터 프레임에서 무작위로 샘플 코드를 가져 와서 상위 수준의 모든 통계 단위에서 샘플링하지 않는다는 것을 깨달았습니다. 약 1 백만개의 우편 번호와 7000 개의 중간 산출물 통계 단위가 있습니다. 샘플에 각 통계 단위의 포스트 코드 수가 대략 같아야합니다.R : 범주 범위에서 짝수 개의 관측치를 랜덤 샘플링

각 상위 수준 통계 단위에서 35 개의 엽서 코드를 무작위로 샘플링하려면 어떻게합니까? 어떻게 (msoa를 참조 같은 높은 수준의 통계 단위로 다른 열 변수에 따라 우편 번호의 무작위 표본 할당량 (예를 지정합니까

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

:

나는 무작위로 25 개 우편 번호를 샘플링 이전에 다음 코드를 사용 아래의 데이터 프레임 구조에서 .rank))?

데이터베이스 stucture :

'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 = 우편

msoa.rank는 = 각각의 중간 출력 통계적 유닛의 순서 변수

답변

1

모든 msoa.rank에는 최소한 35 개의 우편 번호가 있습니까? 이것은 그래서 여기 data.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] 

로 빨리 고전 iris 데이터 집합을 사용하여 어떻게 작동하는지에 대한 예입니다됩니다. 여기

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 

차이

것으로 보인다
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 
+0

제안 해 주셔서 감사합니다. 마이크.코드는 작동하지만 실제로 무작위 샘플을 가져 옵니까? 세 개의 샘플을 생성했으며 요약 통계는 모두 동일했습니다. –

+0

흥미 롭군요 ... 그것은 나를 위해 일하는 것 같습니다. 위에 삽입 한''홍채''예제를 모방 할 수 있습니까? –

+0

안녕 마이크, 두 번째 시도에서 이것은 완벽하게 작동했습니다. 감사! –

2

희망 곧 고정한다 쉽다 dplyr (감사합니다, @Henrik!)

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

, 여기에 그룹에 대한 평범한 구식 plyr와 해결 방법, (@beginneR 덕분에)

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

또는 스틱입니다.

library(plyr) 
yourSample <- ddply(yourData, "msoa.rank", .fun = function(x) {sample_n(x, size = 35)}) 
+1

[사용 문제 '데이터 그룹핑 sample_n' (https://github.com/hadley/dplyr를보고 또 다른 샘플 및 요약/issues/405). – Henrik

+0

와우, 좋지 않아. Nice catch, @Henrik – rrs

+1

해결 방법으로'dplyr' 버전에서'group_by' 다음에'do (sample_n (., 35))'를 시도하십시오. –