在R中生成n个不同的值x次

Jas*_*hah 2 r

我想创建一个矢量,它具有从1到20三十次但不均匀的不同值.

例如:可以有四个计数为1,一个计数为2,两个计数为3等.但每个数字的计数必须加起来为30,并且必须有20个不同的值.

我试过了:

set.seed(3) 
sample(x = 1:20, size = 30, replace = TRUE)
Run Code Online (Sandbox Code Playgroud)

但它并不总是提供从1到20的所有值.某些值返回的次数更多,并且根本不返回某些值.

我想创建一个具有所有不同值的向量,数字必须是整数.

eti*_*nne 5

你可以做三次:

  • 生成一个没有替换的20号样本:你有1次每个值

  • 生成具有替换的10号样本

  • 对两个样本进行抽样

这是结果

a <- sample(1:20, 20)
b <- sample(1:20, 10, replace = TRUE)
result <- sample(c(a, b), 30)

# result
#  [1]  1 10 20 11 16 12  9  8 20  4 15  2  7  5 19 18  6 13 14 17 11  5  1  7  4 19  6 16  3  3

# table(result) # every value appear at least one time
# result
#  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
#  2  1  2  2  2  2  2  1  1  1  2  1  1  1  1  2  1  1  2  2 
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用单行代码执行此操作:

sample(c(sample(1:20, 20), sample(1:20, 10, replace = TRUE)), 30)

# [1]  4 13 15 20  6  5  9 11 11 14 17  1 10  9  3 10 11 12 18 17  8  7 18 12 19 16  2 13 13  4
Run Code Online (Sandbox Code Playgroud)

感谢James的评论,您可以使用更快的解决方案:

sample(c(1:20,sample(20,10,replace=TRUE)))
Run Code Online (Sandbox Code Playgroud)

这是microbenchmark比较:

# Unit: relative
#     expr      min       lq     mean   median     uq       max neval
#  etienne 1.727202 1.538411 1.529077 1.571341 1.5998 0.6855444  1000
#    james 1.000000 1.000000 1.000000 1.000000 1.0000 1.0000000  1000
Run Code Online (Sandbox Code Playgroud)

  • 你不需要打扰其中一个样本,例如`样本(c(1:20,样本(20,10,替换= TRUE)))``将完成这项工作. (2认同)