R复制直到长度达到

时间:2017-03-22 19:09:36

标签: r replicate

说我们有以下内容:

a=c( 1, 9, 5, 7, 8, 11)
length(a) ## 6

我希望获得:

a_desired=c( 1, 1, 9, 9, 5, 5, 7, 7, 8, 11)
length(a_desired) ## 10

基本上它会在达到所需长度时停止复制,在本例中为10。

如果所需长度为14,

a_desired=c( 1, 1, 1, 9, 9, 9, 5, 5, 7, 7, 8, 8, 11, 11)

是否有人建议如何获取此信息或者之前提到的类似链接?(我不太确定要查找的关键字)

2 个答案:

答案 0 :(得分:1)

您可以编写自己的函数来执行此类操作

extend_to <- function(x, len) {
    stopifnot(len>0)
    times = len %/% length(x)
    each <- rep(times, length(x))
      more <- len-sum(each)
      if (more>0) {
       each[1:more] <- each[1:more]+1
      }
      rep(x, each)
}


a <- c( 1, 9, 5, 7, 8, 11)
extend_to(a, 6)
# [1]  1  9  5  7  8 11
extend_to(a, 10)
# [1]  1  1  9  9  5  5  7  7  8 11
extend_to(a, 14)
# [1]  1  1  1  9  9  9  5  5  7  7  8  8 11 11
extend_to(a, 2)
# [1] 1 9

我们使用rep()重复每个元素一定次数。

答案 1 :(得分:0)

因此,如果您的序列当前长度为M,并且您希望长度为N&gt; M,那么你有这些可能性:

N&lt; = 2M:将第一个(N-M)项加倍

2M&lt; N <= 3M:第一个(N-2M)项目的三倍,其余的两倍

3M&lt; N <= 4M:第一个(N-3M)项目翻两番,其余为三倍。

等等。

首先,将目标长度除以当前长度,发言,并多次复制序列。然后添加第一个余数项目的额外副本。

a=c( 1, 9, 5, 7, 8, 11)
m=length(a)

n=10 # desired new length

new_a = append(
  rep(a[1:(n%%m)],each=ceiling(n/m)), 
  rep(a[((n%%m)+1):m],each=floor(n/m)))