重复一个已重复的序列

22

我们想要得到一个像这样的数组:

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

最简单的方法是什么?


它考虑了使用for循环,但是难道没有更简单的方法吗? - Fabian Stolz
5个回答

60
你可以使用单个rep调用完成它。参数eachtimes按顺序进行评估,首先执行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

20

或者更简单的方式(假设您指的是向量,而不是数组)

rep(rep(1:4,each=3),3)

看到这些年后,我不确定它是否更简单,但我认为可以说它更灵活,因为您可以使用它首先执行“乘法”操作,然后再进行“每个”处理。 - IRTFM

9

如果您的数字序列每次增加1,则42-'s的答案可以奏效。但是,如果您想包括按固定间隔增加的数字序列(例如从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  

您只需要更改您希望此操作重复的次数即可。

1
要进一步随机化结果向量(或随机更改向量的顺序),只需执行以下操作:sample(rep(seq(0,60,15), times = 3)) - Good Will

2

像这样:

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

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


3
你应该看一下Dieter的回答——“each”参数可以比使用sapply函数更好地实现你正在做的事情。 - Dason

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接