2014-06-30 28 views
2

我以前從我的數據框中隨機抽取了一段郵編,然後意識到我並未跨越所有更高級別的統計單位進行抽樣。我有大約100萬個郵政編碼和7000箇中產量統計單位。我希望樣本的每個統計單位的郵編大致相同。R:隨機抽樣來自一系列類別的偶數觀察值

我該如何從每個更高級別的統計單元隨機抽樣35個郵編?

我用下面的代碼先前以隨機抽樣250000層郵政編碼:

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

如何指定基於另一列變量郵政編碼的隨機樣本配額(例如,諸如更高級別統計單元(參見MSOA .rank在下面的dataframe結構中))?

數據庫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

有趣....它似乎在爲我工作。你能模仿我上面插入的'''iris'''的例子嗎? –

+0

嗨邁克,第二次嘗試這個工作完美。謝謝! –

2

容易 將希望很快被固定在dplyr(謝謝,@Henrik!)

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

在此之前,這裏有一個解決辦法,(感謝@beginneR)

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

或堅持使用普通的老式plyr的分組。

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

似乎有一個[使用問題'sample_n'上分組的數據(https://github.com/hadley/dplyr /問題/ 405)。 – Henrik

+0

哇,那不好。很好的捕獲,@Henrik – rrs

+1

在'dplyr'版本的'group_by'之後嘗試'do(sample_n(。,35))'作爲解決方法。 –