我找不到与我的问题有关的任何内容,因此希望有人可以帮助我。 我有一个数据框(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
答案 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万条记录。
谢谢您的帮助,您的方法效果很好,但是我认为这是一个很好的机会,可以了解有关应用功能的更多信息。