代码之家  ›  专栏  ›  技术社区  ›  T.Beil

在数据表中选取均匀分布的样本

  •  0
  • T.Beil  · 技术社区  · 7 年前

    假设我有一个如下所示的示例数据集:

    df = data.table(id = 1:100,group=rep(c('a','b','c','d'),25))
    

    我想,比方说,从这一组中进行80次观察 十、 非重叠样本。重要的特点是,每个样本在各组中的分布必须均匀。

    例如:

    x=20 will give a first sample of
    1 a
    5 b
    15 c
    28 d
    

    这是一个非常方便的示例,但它也必须适用于不太方便的情况(例如,当x=7时)。

    我的第一次尝试是使用 分裂 ,如下所示:

    df_split = split(df, as.numeric(as.factor(df$id)) %% 7)
    

    这正是我想要的,只是它不能从每个组中统一选择!

    2 回复  |  直到 7 年前
        1
  •  0
  •   akash87    7 年前

    如果我理解正确,因为您正在寻找7组80个样本,您可能希望将其作为循环运行:

    dt <- data.table(id = 1:100,group=rep(c('a','b','c','d'),25))
    
    newmat <- data.frame(Index = 1:80)
    for(i in 1:7){
      k <- NULL
      for(j in unique(dt$group)){
        dt.sub <- dt[group == j]
        samps <- sample_n(dt.sub, 20, replace = F)
        k <- c(k,samps$id)
      }
      newmat <- cbind(newmat, k)
    }
    
    colnames(newmat) <- c("Index", paste0("k",1:7))
    
        2
  •  0
  •   NewUser    7 年前

    如果我理解正确,这可能就是您想要的:

    df = data.frame(id = 1:100,group=rep(c('a','b','c','d'),25))
    
    repeat {
      mysample <- sample(df$id, size=4, replace=TRUE)  # takes sample
      test     <- (sum(duplicated(df[mysample, ]$group)) == 0)  # true if no duplicates
    
      if (test == 1)
        break
    }
    
    mysample
    df[mysample, ]  # retrieves data
    
    推荐文章