2012-06-24 62 views
10

我们希望得到一个数组,看起来像这样:重复重复序列

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 

什么是做到这一点的最简单的方法?

+0

它想到了一个for循环,但不是有一个更简单的方法吗? –

回答

30

您可以用单一rep调用做到这一点。首先完成eachtimes参数,然后依次评估each

rep(1:4, times=3, each=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 
+1

这在我看来应该是被接受的答案 – Andrie

2

像这样:

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

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

+3

你应该看看Dieter的答案 - 'each'参数会比你使用sapply调用做的更好。 – Dason

17

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

rep(rep(1:4,each=3),3) 
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