我们希望得到一个如下所示的数组:
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
最简单的方法是什么?
你可以通过一个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
或者,更简单(假设你的意思是一个向量,而不是一个数组)
rep(rep(1:4,each=3),3)
如果您的数字序列递增 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
你只需要改变你想要重复的次数。
像这样:
rep(sapply(1:4, function(x) {rep(x, 3)}), 3)
rep(x, N) 返回一个重复 x N 次的向量。sapply 将给定函数分别应用于向量 1:4 的每个元素,连续重复每个元素 3 次。
这是一种使用数组操作的方法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