我需要生成一组随机长度的整数(从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
函数,但是那个不生成整数,但是我不能用于我需要的计算的列表。
这该怎么做?
使用:
# 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: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)))