假设我的数据结构如下:
country population
1 Afghanistan 30000000
2 Brazil 200000000
3 Cameroon 22250000
这里有总计2.522亿人。假设我想随机选择一个人:
i <- sample (1:sum(df$population))
然后报告她的国家。如何找到与个人i相对应的国家/地区行?我知道经验法则是通过数据框的迭代意味着你做错了什么,但是(除了创建一个每个人有一行的新列表,听起来很糟糕)我不能想到一个找出个人在人口中的位置的好方法。
答案 0 :(得分: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
另一种方法是计算人口的累积总和,从 world pop 中抽样,然后确定该人的国家/地区:
> 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
第一种选择更为简单,但第二种选择具有实际采样的优势,而某人&#34;如果您需要将其用于其他目的而不是退回国家。