基于大数据框架的列值从概率中采样

时间:2018-11-05 05:55:00

标签: r sampling large-data

我找不到与我的问题有关的任何内容,因此希望有人可以帮助我。 我有一个数据框(300万条记录),其中包含三列,其中包含发生每个“事件”的概率。因此,一条记录的一个基本示例是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

2 个答案:

答案 0 :(得分:1)

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

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

它使用runif生成0到1之间的统一随机值,并将它们与数据帧中的概率累积总和逐行比较,就像Excel解决方案一样。但是,与在cumsum中使用R函数相比,使用数组加法显式地计算这些总和要快大约100倍(在本示例中),如对cbind的调用所示

答案 1 :(得分:0)

我最终使用了带服装功能的申请。

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万条记录。

谢谢您的帮助,您的方法效果很好,但是我认为这是一个很好的机会,可以了解有关应用功能的更多信息。