在尝试从数据表中的组中随机抽取样本时,我尝试使用带有sample(c(1, rep(0, .N-1)))
的虚拟列,但是当我执行此操作时,data.table
中的某些内容似乎非常错误
示例
> library(data.table)
> set.seed(151)
> DT = data.table(L = rep(c("A","B", "C"), 4), X = rnorm(12), i = 1:12)
> DT[, S := sample(c(1, rep(0, .N-1))), by = L]
> DT[S==1]
L X i S
1: C -0.1467396 3 1
2: A -1.3974781 7 1
3: B -1.0188383 8 1
>
> DT[, S := sample(c(2, rep(0, .N-1))), by = L]
> DT[S==2]
L X i S
1: A 0.6721730 10 2
2: B -0.4845518 11 0
3: C 0.5606090 12 2
>
> DT[, S := sample(c(3, rep(0, .N-1))), by = L]
> DT[S==3]
L X i S
1: B -0.4845518 11 3
2: C 0.5606090 12 3
>
> DT
L X i S
1: A -0.05153895 1 0
2: B 0.76573738 2 0
3: C -0.14673959 3 0
4: A -0.11318581 4 3
5: B -0.39551140 5 0
6: C 0.78227595 6 0
7: A -1.39747811 7 0
8: B -1.01883832 8 0
9: C 0.22947586 9 0
10: A 0.67217297 10 0
11: B -0.48455178 11 3
12: C 0.56060896 12 3
>
正如您所看到的,不仅每次尝试都没有插入正确数量的1,而且DT[S==1]
不再正常运行,不知何故返回S不为1的行。
这里发生了什么?
值得注意的是,第一次调用它似乎工作正常 - 所以这表明在现有列的顶部分配组时会发生奇怪的事情。