如何从大清单中抽取许多10个样本,而不整体替换


12

我有大量数据(20,000个数据点),我想从中重复取样10个数据点。但是,一旦选择了这10个数据点,就不要再次选择它们。

我已经尝试过使用该sample函数,但是它似乎没有一个选项,可以在不替换该函数的多个调用的情况下进行采样。有没有简单的方法可以做到这一点?

Answers:


9

您可以对整个数据集调用一次样本以对其进行置换。然后,当您想获取一个样本时,可以获取前10个。如果想要另一个样本,请获取接下来的10个。依此类推。


9

戴森的思想,在R中得以实现:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample

(+1)真正整齐的R代码。值得注意的是,如果为奇数,它将不起作用。n
chl 2010年

@chl谢谢!但我认为它将起作用。任务是从一组数据点中提供大小为10的样本。假设n =长度(数据点)。该代码给出了此类样品的最大数量(n%/%10)。第一个极端情况是n <10(无论如何在问题陈述中通过将数据集描述为“大”来排除,即n> 10)。在这种情况下,您将获得数据点和警告(不是错误)。第二个极端情况是是否存在悬空元素(当n %% 10!= 0时)。然后,您将获得尽可能多的样本和一个警告(不是错误)。在这两种情况之一中包含奇数情况。
conjugateprior

似乎列表的第一个元素的长度为11,而不是10,并sum(unlist(lapply(sample, length)))返回其长度datapoints(我将其设置为1001)。
chl 2010年

@chl该死!你说得很对。
共轭

2

这应该工作:

x <- rnorm(20000)
x.copy <- x
samples <- list()
i <- 1
while (length(x) >= 10){
    tmp <- sample(x, 10)
    samples[[i]] <- tmp
    i <- i+1
    x <- x[-match(tmp, x)]
}

table(unlist(samples) %in% x.copy)

但是,我认为这不是最优雅的解决方案...


1

@conjugateprior您的答案朝着正确的方向发展。但是至少对于我当前的R版本3.4.3,它不起作用。但是,通过一些调整它可以工作:

mysample<-split(sample(length(datapoints)), 1:10)
mysample[[9]] ## the ninth sample

由于我无法发表评论,因此我选择在此处回答。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.