【问题标题】:Draw ID's from a data frame based on conditions and probabilities for the conditions根据条件和条件的概率从数据框中绘制 ID
【发布时间】:2018-05-20 08:39:14
【问题描述】:

我有以下数据框

ID <- c(1,2,3,4,5,6)
pop <- c(10,10,10,10,1000,1000)
df <- data.frame(pop,ID)

现在我想从这个数据框中绘制唯一 ID,条件是,我绘制人口大于或等于 1000 的 ID 的概率为 0.1,以及绘制人口 ID 的概率低于 1000 的为 0.9。

这是我想出的代码:

sample(c(df$ID[df$pop>=1000],df$ID[df$pop<1000]),3, prob=c(0.1,0.9))

但是,我收到以下错误消息:

Error in sample.int(length(x), size, replace, prob) : 
  incorrect number of probabilities

我怎样才能重写这个问题,使它在不为每个 ID 分配概率的情况下工作?

【问题讨论】:

    标签: r conditional sample sampling


    【解决方案1】:

    也许这就是你的解决方案:

    # 1. Data set
    df <- data.frame(
      id = c(1, 2, 3, 4, 5, 6),
      population = c(10, 10, 10, 10, 1000, 1000))
    
    # 2. Set 'probability' by 'population'
    df <- df %>% 
      mutate(probability = ifelse((population >= 1000), 0.1, 0.9))
    

    【讨论】:

      【解决方案2】:

      一种简单的方法是为每个 ID 创建一个概率向量并将其传递给sample 函数。对于具有 pop &gt;=1000 概率向量的 ID 应该有 0.1 并且对于具有 pop &lt;1000 向量的 ID 应该包含 0.9

      # Create a probability vector for each ID and pass it to sample function. 
      sample(df$ID, 3, prob = ifelse(df$pop>=1000, 0.1, 0.9))
      #[1] 4 3 2
      sample(df$ID, 3, prob = ifelse(df$pop>=1000, 0.1, 0.9))
      #[1] 2 1 4
      sample(df$ID, 3, prob = ifelse(df$pop>=1000, 0.1, 0.9))
      #[1] 3 2 4
      

      数据:

      ID <- c(1,2,3,4,5,6)
      pop <- c(10,10,10,10,1000,1000)
      df <- data.frame(pop,ID)
      

      【讨论】:

      • 感谢您的回答。这是有道理的,但是我唯一的问题是,通过这种方法,我最终可能会得到不唯一的 ID。但是,我需要唯一的 ID 来进行以下计算。
      • @Mucteam 是的。它会给你重复的ID。您必须添加额外的逻辑来选择唯一的。一种选择是您一次只对1 进行采样。
      • 所以我抽了一个,并提出了一个条件,如果下一个抽到的号码已经抽到了,那么我应该放弃它。但这会影响我其他号码中奖的概率对吗?
      • @Mucteam 你是对的。我已更新我的答案以从 sample 本身获取 prob 参数。
      猜你喜欢
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2023-02-20
      • 2018-06-04
      相关资源
      最近更新 更多