我有一个很大的data.table
,我正在尝试使用其中一列的值作为分布参数来生成二项式随机数(使用rbinom
)。假设index
是唯一的行标识符,并且该参数位于responseProb
列中。然后
dt[, response := rbinom(1, 1, responseProb), by = index]
rbinom
的签名是rbinom(n, size, prob)
,但由于它没有在prob
参数上进行矢量化,因此它只能将标量作为输入,因此我可以&#39 ; t,但能够写:
dt[, response := rbinom(1, 1, responseProb)]
举一个我的意思的简单例子,rbinom(1, 1, seq(0.1, 0.9, .1))
,产生
> rbinom(1, 1, seq(0.1, 0.9, .1))
[1] 1
我认为解决方法是使用
dt[, response := rbinom(probResponse, 1, responseProb)]
但是要仔细检查这是否会导致与第一行代码相同的答案。
答案 0 :(得分:2)
因此rbinom
被矢量化,您可以使用.N
作为第一个参数。
dt[, response := rbinom(.N, 1, responseProb)]
要检查这是否与索引解决方案提供相同的结果,只需设置种子并重复。
# create reproducible example
N <- 100
dt <- data.table(responseProb = runif(N),
index = 1:N)
# set seed
set.seed(1)
# your original version
dt[, response := rbinom(1, 1, responseProb), by = index]
# set seed again
set.seed(1)
# version with .N
dt[, response2 := rbinom(.N, 1, responseProb)]
# check for equality
dt[, all(response == response2)]
## [1] TRUE