R 复制直到满足长度

R Replicating until length is met

假设我们有以下内容:

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)

有没有人对如何获得这个或可能 link 之前问过的类似问题有任何建议?(我不太确定要寻找什么关键字)

你可以编写自己的函数来做这样的事情

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() 将每个元素重复一定次数。

因此,如果您的序列当前长度为 M,而您希望长度 N > M,那么您有以下可能性:

N <= 2M:将前 (N-M) 个项目加倍

2M < N <= 3M:前 (N-2M) 个项目的三倍,其余项目的两倍

3M < 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)))