【问题标题】:Repeated sampling from data.table subsets selects rows with replacement, while replacement is turned off从 data.table 子集中重复采样选择有替换的行,同时关闭替换
【发布时间】:2021-07-19 20:24:36
【问题描述】:

我有一个 data.table 并且一列最初是空的(NA 值)。 我想在 NA 列中选择所有具有 NA 值的行,然后选择两个随机样本并用来自循环的索引变量替换它们的 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]
  }

为什么这不起作用?

【问题讨论】:

    标签: r data.table subset sample


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多