我想创建一个矢量,它具有从1到20三十次但不均匀的不同值。
例如: 可以有四个计数为1,一个计数为2,两个计数为3等。但每个数字的计数必须加起来为30,并且必须有20个不同的值。
我试过了:
set.seed(3)
sample(x = 1:20, size = 30, replace = TRUE)
但它并不总是提供从1到20的所有值。某些值返回的次数更多,而且根本不返回某些值。
我想创建一个具有所有不同值的向量,数字必须是整数。
答案 0 :(得分:5)
你可以三次这样做:
生成一个没有替换的20号样本:你有1次每个值
生成带有替换的size-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
请注意,您可以使用单行代码执行此操作:
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
感谢James的评论,您可以使用更快的解决方案:
sample(c(1:20,sample(20,10,replace=TRUE)))
以下是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