Эффективный способ выборки из памяти из вектора отсчетов без замены

#r

#r

Вопрос:

Здесь я представляю банку с шариками, используя вектор цветовых частот

 marbleCounts <- c(red = 5, green = 3, blue = 2)
marbleCounts

red green  blue 
  5     3     2 
  

Теперь я хотел бы выбрать 5 шариков из этого вектора без замены. Я могу сделать это, расширив свой вектор частот в вектор шариков и затем выполнив выборку из него.

 set.seed(2019)
marbles <- rep(names(marbleCounts), times = marbleCounts)
samples <- sample(x = marbles, size = 5, replace = FALSE)
table(samples)

green   red 
    2     3 
  

но это неэффективно с точки зрения памяти (и, возможно, производительности?). Существует ли более быстрый и / или эффективный способ выборки данных, подобных этому?

Комментарии:

1. Вы можете развернуть и выполнить выборку из индексов, а не имен, с помощью rep(seq_along(marbleCounts), times = marbleCounts) .

Ответ №1:

Я думаю, это сработает для вас.

 marbleCounts <- c(red = 5, green = 3, blue = 2)

# first, draw from the possible indexes (does not create the full vector)
draw <- sample.int(sum(marbleCounts), 5)

# then assign indexes back to original group
items <- findInterval(draw-1, c(0, cumsum(marbleCounts)), rightmost.closed = TRUE)

#extract your sample    
obs <- names(marbleCounts)[items]
table(obs)
  

Это никогда не создаст вектор длиннее вашего размера выборки.