基于大 data.frame 的列值的概率样本

Sample from probabilities based on column values for a large data.frame

我找不到任何关于我的问题的具体信息,所以我希望有人能帮助我。 我有一个数据框(300 万 + 记录),其中包含三列,其中包含每个 "event" 发生的概率。因此,一个记录的基本示例是 A 发生的几率为 30%,B 为 20%,C 为 50%。

所以基本上每个观察值都有概率是 A、B 或 C。这个概率取决于 A、B 和 C 列中的值。

下面是一种方法,它从 A、B 和 C 列中采样,然后将采样值分配给列 "Answer"。但是对于 300 万条记录,它根本不起作用。

nRowsDf <- nrow(df)
for(i in 1:nRowsDf){
   df[i,c("Answer")] <- sample(sample(c('A','B','C'), size = 1000,
     replace = TRUE, prob = c(df[i,"A_prop"],df[i,"B_prop"], df[i,"C_prop"]))
   ,1)
}

我确信有比将其置于 运行 +-30 小时的慢循环更好的方法。

我已经转成excel了,不想去了。但这就是我在 excel 中所做的,并进行了一些修改:How To Generate Random Value Based On Assigned Probability In Excel

您引用的 Excel 方法的 R 版本将在四分之一秒内处理您的数据——我希望速度足够快。

  df$Answer <- with(df, names(df)[1 + rowSums(cbind(A, A+B, A+B+C) < runif(n))])

它使用 runif 生成 0 和 1 之间的均匀随机值,并将它们逐行与数据框中概率的累积和进行比较,与 Excel 解决方案完全相同.但是,与其在 R 中使用 cumsum 函数,不如使用数组加法显式计算这些和(在本例中)快大约一百倍,如对 cbind 的调用所示.

我最终使用了 apply 和 costume 函数。

samp <- function(a){  if (sum(a) == 100){
sample(sample(c('A','B',"C"), size = 100, replace = TRUE, prob = c(a)),1)  }  
else{   0  }
}
df$answer <- apply(df[,1:3],1, FUN = samp)

2 分钟内完成 330 万条记录。

感谢胡博的帮助,你的方法很有效,但我认为这是一个了解更多应用函数的好机会。