R 对样本ID使用make.unique

R 对样本ID使用make.unique,r,dataframe,sample,R,Dataframe,Sample,我正试图想出一个快速的方法来分配一些治疗ID,而且…老实说,我现在可以在纸上更快地完成这项工作,但我已经越过了界限,在我弄明白这一点之前,我不能停下来 我想创建一个包含35行的表-每行将包含一个包含9个数字(介于1和12之间)的向量,但每行必须是唯一的 我尝试了一个突然出现在我脑海中的快速解决方案: data.frame(replicate(9,sample(1:12,35, rep = TRUE))) 但这显然对我不起作用,因为“rep=TRUE”和“rep=FALSE”不能像写的那样工作,

我正试图想出一个快速的方法来分配一些治疗ID,而且…老实说,我现在可以在纸上更快地完成这项工作,但我已经越过了界限,在我弄明白这一点之前,我不能停下来

我想创建一个包含35行的表-每行将包含一个包含9个数字(介于1和12之间)的向量,但每行必须是唯一的

我尝试了一个突然出现在我脑海中的快速解决方案:

data.frame(replicate(9,sample(1:12,35, rep = TRUE)))
但这显然对我不起作用,因为“rep=TRUE”和“rep=FALSE”不能像写的那样工作,因为样本池(1:12)。有没有办法添加make.unique来实现这一点


谢谢

可能有更聪明的方法来实现这一点,但一种相对安全的方法是生成比您需要的行多得多的行,然后只需取顶部的X
unique()
行。构建您的代码:

set.seed(1)
x[1]1000000
#有多少行是唯一的?
nrow(唯一(x))
#> [1] 999906
#显示前两行,同时显示如何获得总共35行
头部(唯一(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

由(v0.3.0)创建于2019-10-07假设您想要一个唯一的组合,您可以使用
combn
生成所有可能的组合,然后获取35个随机行的
样本:

# all combos
x <- as.data.frame(t(combn(1:12, 9)))
# 35 random rows
x[sample(1:choose(12,9), 35), ]
#所有组合

具有讽刺意味的是,这里的挑战是有太多可能的唯一值,因此生成所有唯一值并选择其中35个的简单方法是不实用的。@Gregor-yep,这种方法的RAM值大约为
19 Gb
另一种选择,一种我不想编码的奇特选择,这将是在0和12^9-1之间画35个数字,将它们转换为基数11,将每个数字拆分为每个“数字”的列(带前导0),并在每个结果中添加1。@Gregor-这很聪明…
int2B()
来自库
cwhmisc
应该可以很容易地实现这一点,还有
strsplit()
gsub()
,还有一些
作为.integer()
用于转换。@Chase是的。如果这需要是一个高效且可执行的方法,那么这将是一个很好的方法。我的直觉是你的答案适合OP的用例。我不认为
combn()
符合我们的要求。例如,
combn(1:3,2)
生成成对的
(1,2)
(1,3)
,和
(2,3)
,而实际上他所追求的更多是沿着
展开.grid(1:3,1:3)
的路线。对于整个问题,我们需要生成
expand.grid(1:12,1:12,1:12,1:12,1:12,1:12,1:12,1:12,1:12,1:12)
,这将占用我机器上的
19.2
gig内存。虽然不难处理,但这是一个健康的RAM数量,除非你有一些像样的马力可供支配。OP只是说他们想要“独特”的行,而独特的组合是最严格的解释。在任何情况下,这里的220行都是
expand.grid
解决方案中12^12行的子集,因此仍然可以作为答案确定这是公平的。在需要221行而不是35行之前,此解决方案一直运行良好。