Использование make.unique для образцов идентификаторов - PullRequest
3 голосов
/ 07 октября 2019

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

Я хочу создать таблицу из 35 строк - каждая строка будет содержать вектор с 9 числами (от 1 до 12), но КАЖДАЯ СТРОКА ДОЛЖНА БЫТЬ УНИКАЛЬНОЙ.

Я попробовал быстрое решениеэто всплыло в моей голове:

data.frame(replicate(9,sample(1:12,35, rep = TRUE)))

, но это, очевидно, не работает для меня, потому что "rep = TRUE" и "rep = FALSE" не могут работать как написано из-за пула образцов (1: 12). Есть ли способ добавить make.unique для этого?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Предполагая, что вы хотите уникальную комбинацию, вы можете использовать combn для генерации всех возможных комбинаций и затем взять sample из 35 случайных строк:

# all combos
x <- as.data.frame(t(combn(1:12, 9)))
# 35 random rows
x[sample(1:choose(12,9), 35), ]
2 голосов
/ 07 октября 2019

Вероятно, есть более умные способы решения этой проблемы, но один относительно отказоустойчивый подход состоит в том, чтобы сгенерировать намного больше строк , чем вам нужно, а затем просто взять верхние строки X unique(). Построение кода:

set.seed(1)
x <- data.frame(replicate(9,sample(1:12,1e6, rep = TRUE)))
#how many rows did we make?
nrow(x)
#> [1] 1000000
#how many unique rows?
nrow(unique(x))
#> [1] 999906
#show the top two rows while showing how to get 35 rows total
head(unique(x)[1:35, ],2)
#>   X1 X2 X3 X4 X5 X6 X7 X8 X9
#> 1  9  6  8  3 12  7 11  5  5
#> 2  4  1  8 11 12 11 11  7  6

Создано в 2019-10-07 пакетом представительство (v0.3.0)

...