образец с заменой, но ограничить максимальную частоту каждого члена - PullRequest
0 голосов
/ 01 октября 2018

Можно ли расширить функцию sample в R, чтобы она не возвращала больше, чем, скажем, 2 того же элемента, когда replace = TRUE?

Предположим, у меня есть список:

l = c(1,1,2,3,4,5)

Для выборки 3 элементов с заменой я бы сделал:

sample(l, 3, replace = TRUE)

Есть ли способ ограничить его вывод так, чтобы возвращалось только максимум 2 одинаковых элемента?Так что (1,1,2) или (1,3,3) разрешено, но (1,1,1) или (3,3,3) исключено?

1 Ответ

0 голосов
/ 01 октября 2018
set.seed(0)

Основная идея состоит в том, чтобы преобразовать выборку с заменой в выборку без замены.

ll <- unique(l)          ## unique values
#[1] 1 2 3 4 5
pool <- rep.int(ll, 2)   ## replicate each unique so they each appear twice
#[1] 1 2 3 4 5 1 2 3 4 5
sample(pool, 3)          ## draw 3 samples without replacement
#[1] 4 3 5

## replicate it a few times
## each column is a sample after out "simplification" by `replicate`
replicate(5, sample(pool, 3))
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    4    2    2    3
#[2,]    4    5    1    2    5
#[3,]    2    1    2    4    1

Если вы хотите, чтобы разные значения появлялись несколько раз, мы можем сделать, например,

pool <- rep.int(ll, c(2, 3, 3, 4, 1))
#[1] 1 1 2 2 2 3 3 3 4 4 4 4 5

## draw 9 samples; replicate 5 times
oo <- replicate(5, sample(pool, 9))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    5    1    4    3    2
# [2,]    2    2    4    4    1
# [3,]    4    4    1    1    1
# [4,]    4    2    3    2    5
# [5,]    1    4    2    5    2
# [6,]    3    4    3    3    3
# [7,]    1    4    2    2    2
# [8,]    4    1    4    3    3
# [9,]    3    3    2    2    4

Мы можем вызвать tabulate в каждом столбце для подсчета частоты 1, 2, 3, 4, 5:

## set `nbins` in `tabulate` so frequency table of each column has the same length
apply(oo, 2L, tabulate, nbins = 5)
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    2    2    1    1    2
#[2,]    1    2    3    3    3
#[3,]    2    1    2    3    2
#[4,]    3    4    3    1    1
#[5,]    1    0    0    1    1

Счетчик во всех столбцах соответствует верхней границе частоты c(2, 3, 3, 4, 1), которую мы установили.


Не могли бы вы объяснить разницу между rep и rep.int?

rep.int - это не "целочисленный" метод для rep,Это просто более быстрая примитивная функция с меньшей функциональностью, чем rep.Вы можете получить более подробную информацию о rep, rep.int и rep_len на странице документа ?rep.

...