产生一个随机的整数序列... 30次

时间:2017-12-23 20:56:59

标签: r random integer sequence repeat

我需要生成一组随机长度的整数(从1到20),这需要重现30次。要生成随机长度列表,我使用runif函数,它可以工作。但是,当我使用rep函数重复此随机列表时,它只是重复相同的列表30次。我想要的是以下内容:

1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 
1 2 3 
etc.

相反,runif生成一个列表,rep重复30次,所以它看起来像这样:

1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
etc.

我最好像R一样运行runif命令30次。现在,我不知道如何为此编写循环,我也不知道如何使用比循环更优雅的东西。我尝试使用repeat函数,但是那个函数不生成整数,但是我不能用于我需要的计算的列表。

怎么做?

2 个答案:

答案 0 :(得分:3)

使用:

# using set.seed for reproducibility
set.seed(171223)

# create a vector of end-points
ends <- sample(20, 30, TRUE)

# create a list of vector, each from 1 to an end point in 'ends'
lst <- Map(':', 1, ends)

给出了这个列表(显示的前5个元素):

> lst[1:5]
[[1]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16

[[2]]
[1] 1 2 3 4 5 6

[[3]]
[1] 1 2 3 4 5 6 7

[[4]]
[1] 1 2 3 4

[[5]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16

如果您想在一个向量中使用它,可以将其包装在unlist

lst2 <- unlist(Map(':', 1, ends))

给出:

> lst2
  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16  1  2  3  4  5  6  1  2  3  4  5  6  7  1  2  3  4  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16  1  2  3  4  5
 [55]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20  1  2  3  4  5  6  7  8  1  2  3  4  5  1  2  3  4  5  1  2  3  4  5  6  7  8  9 10 11 12 13  1  2  3
[109]  4  5  6  7  8  9 10 11  1  2  3  4  5  6  7  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18  1
[163]  2  3  4  5  6  7  8  1  2  3  4  5  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17  1  2  3  4  5  6  7  8  9 10 11  1  2  3  4  5  6  7  1  2  3  4  5  6  7
[217]  1  2  1  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15  1  2  1  2  3  4  5  6  1  2  3  4  5  6  1  2  1  2  3  4  1  2  3  4  5  6  7  8  9 10 11 12 13 14

答案 1 :(得分:3)

您可以复制1:sample(20, 1) 30次,如下所示。

replicate(30, 1:sample(20, 1))

这会生成一个长度为30的列表,如下所示(仅显示前3个元素)。

[[1]]
[1] 1 2 3 4 5 6 7

[[2]]
 [1]  1  2  3  4  5  6  7  8  9 10 11 12

[[3]]
[1] 1 2 3 4 5 6 7 8

...

如果需要单个矢量结果,只需将表达式包装在unlist()

unlist(replicate(30, 1:sample(20, 1)))