从 data.table 个子集中重复采样选择有替换的行,同时关闭替换

Repeated sampling from data.table subsets selects rows with replacement, while replacement is turned off

我有一个 data.table 并且一列最初是空的(NA 值)。 我想 select NA 列中所有具有 NA 值的行,然后 select 两个随机样本,并用来自循环的索引变量替换它们的 NA 值。 此步骤要重复3次。

我的代码似乎无法生成正确的子集,因为已分配的非 NA 值已被覆盖。

期望的可能输出:

1   3
2   2
3   NA
4   2
5   NA
6   3
7   1
8   NA
9   1

实际可能的输出(2x3 值应该没有 NA 值):

1   3
2   2
3   NA
4   NA
5   NA
6   3
7   NA
8   NA
9   1

MWE:

  d <- data.table(a=c(1,2,3,4,5,6,7,8,9), c=numeric())
  col_name <- "c" # 
  for(chunk in seq(1,3)) {
    d[d[is.na(get(col_name)), .I[sample(.N, 2, replace = FALSE)]], toString(col_name) := chunk]
  }

为什么这不起作用?

这是一种可能的解决方案:

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

for(chunk in seq(1,3)) {
  d[sample(which(is.na(get(col_name))), 2), (col_name) := chunk]
}
d

#   a  c
#1: 1 NA
#2: 2  2
#3: 3  1
#4: 4  2
#5: 5  3
#6: 6  1
#7: 7 NA
#8: 8 NA
#9: 9  3

这也可以不用循环来完成:

n <- 3
d[sample(.N, n * 2), (col_name) := rep(seq_len(n), 2)]
d