【问题标题】:Each row has a population, but I want a random individual每行都有一个人口,但我想要一个随机的人
【发布时间】:2015-06-06 05:32:02
【问题描述】:

假设我的数据结构如下:

      country population
1 Afghanistan   30000000
2      Brazil  200000000
3    Cameroon   22250000

这里共有 2.522 亿人。假设我想随机选择一个人:

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

然后报告她的国家。如何找到与个人 i 对应的国家行?我知道经验法则是通过数据框进行迭代意味着您做错了什么,但是(除了创建一个每个人一行的新列表,这听起来很糟糕)我想不出一个好的方法来计算找出个人 i 在人群中的位置。

【问题讨论】:

  • 您可以对行进行采样,即indx <- sample(nrow(df1),1),并将其用作索引来对行进行子集化。即df1[indx, ]
  • 可以指定权重为sample(),即with(mydata, sample(country,1,prob=population))
  • @akrun:我相信这给了我以相等概率采样的数据帧中的一行,这不等于以相等概率选择其中一个个体。
  • 这就是 MrFlick 的建议所做的。它使抽样国家的概率与其人口成正比。
  • 确实如此。如果将 MrFlick 的格式设置为答案,我会给他打勾以正确地归功于他,但我已经标记了您的扩展版本。

标签: r sample weighted population


【解决方案1】:

正如 MrFlick 在 cmets 中所建议的,您可以使用该国人口给出的概率对该国家进行抽样。

> 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

第一个选择要简单得多,但第二个的优点是实际抽样“某人”,以防您需要将其用于其他事情而不是返回一个国家/地区。

【讨论】:

    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2014-02-18
    • 2021-03-13
    • 1970-01-01
    相关资源
    最近更新 更多