r-data.table中新列的逐行计算



我的问题与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的向量。

但是,当您在sample0调用中调用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

最新更新