基于大 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 万条记录。
感谢胡博的帮助,你的方法很有效,但我认为这是一个了解更多应用函数的好机会。
我找不到任何关于我的问题的具体信息,所以我希望有人能帮助我。 我有一个数据框(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 万条记录。
感谢胡博的帮助,你的方法很有效,但我认为这是一个了解更多应用函数的好机会。