Як взяти багато зразків з 10 з великого списку, без загальної заміни


12

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

Я намагався використовувати цю sampleфункцію, але, схоже, не існує можливості вибірки без заміни на кілька викликів функції. Чи є простий спосіб це зробити?

Відповіді:


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

@chl Дякую! Але я думаю, це спрацює. Завдання полягало в тому, щоб надати зразки розміром 10 з набору точок даних. Припустимо n = довжина (точки даних). Код дає максимальну кількість (n% /% 10) таких зразків. Перший кутовий випадок - n <10 (так чи інакше виключається в заяві проблеми, описуючи набір даних як "великий", тобто n> 10). У такому випадку ви повертаєте точкові дані і попередження (не помилка). Другий кутовий випадок - якщо є звисаючі елементи (коли n %% 10! = 0). Тоді ви отримуєте якомога більше зразків і попередження (не помилка). Незвичайні n ситуації включаються в один з цих двох випадків.
кон'югатприор

Здається, перший елемент списку має довжину 11, а не 10, а sum(unlist(lapply(sample, length)))повертає довжину datapoints(яку я встановив на 1001).
чл

@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

Оскільки я не можу коментувати, я вирішив відповісти тут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.