Как взять много образцов из 10 из большого списка, без полной замены

12

У меня есть большой набор данных (20 000 точек данных), из которого я хочу взять повторные выборки из 10 точек данных. Однако, как только я выбрал эти 10 точек данных, я хочу, чтобы они больше не выбирались.

Я пытался использовать sampleфункцию, но, похоже, у нее нет возможности сэмплировать без замены на несколько вызовов функции. Есть ли простой способ сделать это?

robintw
источник

Ответы:

9

Вы можете вызвать sample один раз для всего набора данных, чтобы переставить его. Затем, когда вы хотите получить образец, вы можете взять первые 10. Если вы хотите получить другой образец, наберите следующие 10. Итак, и так далее.

Dason
источник
9

Мысль Дейсона, реализованная в R:

sample <- split(sample(datapoints), rep(1:(length(datapoints)/10+1), each=10))
sample[[13]] # the thirteenth sample
conjugateprior
источник
n
@chl Спасибо! Но я думаю, что это сработает. Задача состояла в том, чтобы дать образцы размером 10 из набора точек данных. Предположим, что n = длина (точки данных). Код дает максимальное количество (n% /% 10) таких образцов. Первый угловой случай - это n <10 (во всяком случае, это исключено в постановке задачи, описывая набор данных как «большой», то есть n> 10). В этом случае вы возвращаете точки данных и предупреждение (не ошибка). Второй угловой случай, если есть висячие элементы (когда n %% 10! = 0). Тогда вы получите как можно больше сэмплов и предупреждение (не ошибка). Нечетные n ситуаций относятся к одному из этих двух случаев.
conjugateprior
Кажется, первый элемент списка имеет длину 11, а не 10, и sum(unlist(lapply(sample, length)))возвращает длину datapoints(которую я установил в 1001).
ЧЛ
@ ЧЛ Черт! Ты совершенно прав.
conjugateprior
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

Поскольку я пока не могу комментировать, я решил ответить здесь.

пятые
источник