我需要从数据集中提取几个分层的子集。我发现首先只生成行索引是有帮助的,然后我使用它来子集数据集以供进一步分析。我做了以下工作:
#strata variable
a1 <- c(1,1,1,2,2,2,2,2,3,3,3,4,5,5,5,5,5,5,6,6,7,7,7,7)
set.seed(9292)
#some values
a2 <- rnorm(24)
xdt <- as.data.table(cbind(a1, a2))
#total possibilities
prod(xdt[,.N,by=a1]$N)
idlist <- list()
for(i in 1:1000){
set.seed(i)
xdt2 <- xdt[, .SD[sample(.N, min(1,.N))], by = a1]
#return the index
idlist[[i]] <- which(xdt$a2%in%xdt2$a2)
}
#create a tabular format of the indices
#each row of the table is to be used to subset datasets for analysis
idlist <- matrix(unlist(idlist), nrow = 7)
idlist <- t(idlist)
idlist <- as.data.table(idlist)
idlist <- unique(idlist)当每层选择一行时,大约有2000个不同的子集可以提取。当我运行上面的代码时,我发现使用unique命令删除了一些行。这很好,因为到目前为止,最终结果似乎是相同的。如果我想最终得到1000个唯一索引,我可以将总迭代次数增加到1000次以上。然而,我想知道这是否正常?如果set.seed在每次迭代中都在变化,那么不是应该一直都有完全独特的可能性吗,特别是在总可能性如此之多的情况下(2160,在这种情况下几乎是两倍)?
或者,我正在犯一个对我来说并不明显的错误?
发布于 2021-07-02 01:37:45
正如评论中所解释的。使用set.seed不能保证随机性。
https://stackoverflow.com/questions/68153251
复制相似问题