【问题标题】:How to avoid loops in outcome generator如何避免结果生成器中的循环
【发布时间】:2020-08-10 00:07:29
【问题描述】:

我有一个数据框,其中包含三个结果的概率:A、B 和 C。它们的概率是 prob1、prob2 和 prob3:

df = data.frame(prob1=runif(1000,0,0.2),prob2=runif(1000,0,0.1))
df$prob3 = 1-df$prob1-df$prob2

我正在尝试根据每一行的独特概率模拟其结果并运行以下循环:

df$outcome = NA
for (i in 1:1000) {
   df$outcome[i]<-sample(c(A,B,C), 1, prob = c(df$prob1[i],df$prob2[i],df$prob3[i]), replace = FALSE)
}

我有一个大型数据集,希望避免循环。我该怎么做?

【问题讨论】:

    标签: r dataframe loops


    【解决方案1】:

    这是通过多项式抽样的一种方法:

    m <- t(apply(df,1,rmultinom,n=1,size=1))  ## 1000 x 3 matrix of 0/1 values
    w <- apply(m,1,which)                     ## vector of 1000 values in {1,2,3}
    

    如果你想要标签,你可以在后面加上c("A","B","C")[w]

    如果你想超越基础 R,Hmisc 包有 rMultinom

    library(Hmisc)
    colnames(df) <- c("A","B","C")
    w <- rMultinom(df, m=1)
    

    我修改了列名,因为rMultinom 自动使用列名作为样本的值。

    如果您需要非常快矢量化多项式采样,并且愿意处理编译代码的麻烦,this question 的答案可以提供帮助。

    【讨论】:

      【解决方案2】:

      你可以使用apply

      df$outcome <- apply(df, 1, function(x) sample(c(A, B, C), 1, prob = x))
      

      或者使用dplyrrowwise

      library(dplyr)
      
      df %>%
        rowwise() %>%
        mutate(outcome = sample(c(A,B, C), 1, prob = c_across()))
      

      【讨论】:

        猜你喜欢
        • 2014-07-17
        • 1970-01-01
        • 2021-04-25
        • 2011-03-14
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 2021-08-10
        • 1970-01-01
        相关资源
        最近更新 更多