正如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
第一種方法比較簡單,但第二種方法的優點是可以實際取樣「某人」,以防您需要將其用於某個國家而不是返國。
您可以對行進行採樣,例如'indx < - sample(nrow(df1),1)',並將其用作索引來對行進行子集化。 i..e'df1 [indx,]' – akrun
你可以指定'sample()'的權重,即'with(mydata,sample(country,1,prob = population))' – MrFlick
@akrun:我相信這會給我我的數據框中的一行以相等的概率抽樣,這不等於選擇具有相等概率的個體之一。 – Philip