2015-06-06 56 views
1

假設我有結構化這樣的數據:每行有人口,但我希望有一個隨機個體

 country population 
1 Afghanistan 30000000 
2  Brazil 200000000 
3 Cameroon 22250000 

共有在座2.522億人。假設我要挑一個人隨意:

i <- sample (1:sum(df$population))

然後報告她的國家。我如何找到與個人i相對應的國家/地區行?我知道經驗法則是,通過數據框的迭代意味着你做錯了什麼,但是(除了創建一個新的列表,每個人一行,這聽起來很可怕),我想不出一個好的方法來確定在哪裏個人我屬於人口。

+3

您可以對行進行採樣,例如'indx < - sample(nrow(df1),1)',並將其用作索引來對行進行子集化。 i..e'df1 [indx,]' – akrun

+6

你可以指定'sample()'的權重,即'with(mydata,sample(country,1,prob = population))' – MrFlick

+0

@akrun:我相信這會給我我的數據框中的一行以相等的概率抽樣,這不等於選擇具有相等概率的個體之一。 – Philip

回答

3

正如MrFlick在評論中所建議的那樣,您可以用該國人口給出的概率對該國進行抽樣。

> pops <- read.table(text="country population 
1 Afghanistan 30000000 
2  Brazil 200000000 
3 Cameroon 22250000", header=T) 

> sample(pops$country, 1, prob=pops$population) 

作爲如何,這將是正比於人口的例子,只是做了很多的時間和採樣之間的比率大致相同的羣體之間的比率:

> set.seed(42) 
> countries <- replicate(100000, sample(pops$country, 1, prob=pops$population)) 
> table(countries)/sum(table(countries)) 
countries 
Afghanistan  Brazil Cameroon 
0.12058  0.79052  0.08890 

> pops$population/sum(pops$population) 
[1] 0.11892963 0.79286422 0.08820614 

這樣做的另一種方法是計算人口的累積總和,從世界流行抽樣,然後確定該人的國家是:

> pops$cumPop <- cumsum(pops$population) 
> set.seed(42) 
> person <- sample(1:pops$cumPop[nrow(pops)], 1)  
> pops$country[which(person <= pops$cumPop)[1]] #The country is the first with cumSum higher than the person ID. 
[1] Cameroon 
Levels: Afghanistan Brazil Cameroon 

第一種方法比較簡單,但第二種方法的優點是可以實際取樣「某人」,以防您需要將其用於某個國家而不是返國。

相關問題