20

我们希望得到一个如下所示的数组:

1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4

最简单的方法是什么?

4

5 回答 5

56

你可以通过一个rep电话来做到这一点。each和参数在先完成的情况times下按顺序进行评估each

rep(1:4, times=3, each=3)  # 'each' done first regardless of order of named parameters
#[1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4
于 2012-06-24T21:20:29.047 回答
18

或者,更简单(假设你的意思是一个向量,而不是一个数组)

rep(rep(1:4,each=3),3)
于 2012-06-24T18:42:28.287 回答
7

如果您的数字序列递增 1,则 42- 的答案将起作用。但是,如果您想包含按设定间隔增加的数字序列(例如,从 0 到 60 乘 15),您可以这样做:

rep(seq(0,60,15), times = 3)
[1]  0 15 30 45 60  0 15 30 45 60  0 15 30 45 60  

你只需要改变你想要重复的次数。

于 2018-06-20T15:56:43.907 回答
2

像这样:

rep(sapply(1:4, function(x) {rep(x, 3)}), 3)

rep(x, N) 返回一个重复 x N 次的向量。sapply 将给定函数分别应用于向量 1:4 的每个元素,连续重复每个元素 3 次。

于 2012-06-24T18:39:38.630 回答
0

这是一种使用数组操作的方法aperm。这个想法是构造一个包含值的数组。重新排列它们,使它们使用 匹配所需的输出aperm,然后使用“展开”数组c

c(aperm(array(1:4, dim=c(4,3,3)), c(2, 1, 3)))
 [1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4
于 2017-11-01T20:20:55.997 回答