我的问题与data.table的内部有关,我想:
为什么CCD_ 1函数将列视为大小>1,而pmin
函数正在处理列,就好像它们是(按行(变量一样?
我希望这个示例代码能澄清我的问题:
library(data.table)
dt <- data.table(probs = runif(1000000), probs2 = runif(1000000))
dt[, hit := sample(c(0,1), 1, prob = c(1 - probs, probs))]
# Error in sample.int(length(x), size, replace, prob) :
# incorrect number of probabilities
dt[, min_prob := pmin(probs, probs2)] # working as expected
dt[, hit := sample(c(0,1), 1, prob = c(1 - probs, probs)), by=1:nrow(dt)] # working
-----------------------附加-------------------------------------
by=1:nrow(dt)
接受答案与方法的比较
library(data.table)
dt <- data.table(probs = runif(1000000))
set.seed(1234)
system.time(dt[, hit := sapply(probs, function(x) sample(0:1, 1, prob=c(1 - x, x)))])
set.seed(1234)
system.time(dt[, hit2 := sample(c(0,1), 1, prob = c(1 - probs, probs)), by=1:nrow(dt)])
all.equal(dt$hit, dt$hit2)
# TRUE
您滥用了sample
函数。从?sample
的文档来看,prob
的自变量采用:
prob:用于获得被采样向量的元素的概率权重向量。
由于有两个可能的值c(0, 1)
,因此需要prob
是长度为2的向量。
但是,当您在sample
0调用中调用prob = c(1 - probs, probs)
时,它相当于调用长度为2000000的向量prob = c(1 -df$probs, df$probs)
,而不是您需要的长度为2的向量。
解决方案是使用sapply
:
library(data.table)
dt <- data.table(probs = runif(5), probs2 = runif(5))
dt[, hit := sapply(probs, function(x) sample(0:1, 1, prob=c(1 - x, x)))]
dt
#> probs probs2 hit
#> 1: 0.1196779 0.46539006 0
#> 2: 0.9896483 0.31307527 1
#> 3: 0.4169862 0.08778795 0
#> 4: 0.9456939 0.09123848 1
#> 5: 0.5033147 0.27397908 0