首页 > 解决方案 > 如何有效地将 rbinom 函数应用于数据框中的每一行?

问题描述

给定一个包含不同变量的计数和变化率的数据表,我如何从给定比率的每个变量的计数中采样?例如,给定以下数据表,我可以循环并使用 sample 或 rbinorm 函数来获得所需的输出。但是,我尝试在其上实现此功能的数据集非常大。有没有提高性能的方法?

library(data.table)
set.seed(1)

dt <- data.table(
count = sample(10000:20000, 100),
rate = sample(1:20, 100, replace = T) / 1000
)

system.time(
for (i in 1:nrow(dt)){
  dt$sample_n[i] <- sum(sample(1:0, 
                           dt$count[i], 
                           prob = c(dt$rate[i], 1-dt$rate[i]), 
                           replace = T))
}
)

system.time(
for (i in 1:nrow(dt)){
  dt$sample_n2[i] <- rbinom(size = dt$count[i], n = 1, prob = dt$rate[i])
}
)

标签: rperformancedata.tablevectorizationsample

解决方案


所有采样函数通常都是矢量化的,这意味着您可以直接执行以下操作:

dt$sample_n2 <- rbinom(size = dt$count, n = nrow(dt), prob = dt$rate)

推荐阅读