2017-03-22 4 views
0

우리는 다음과 같은이 말 충족 :R의 복제는

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

내가 가져올 :이 경우 10,

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

기본적으로 그것이 원하는 길이에 도달하면 복제 정지 .

원하는 길이가 14 인 경우,

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

누구나이 도구를 구하는 방법에 대한 제안이 있습니까? 아니면 비슷한 질문에 대한 링크가 있습니까? (검색 할 키워드가 너무 많지 않습니다.)

+0

원하는 길이가 너무 길면 어떤 일이 일어나는지 말하고 싶을 것입니다. 예를 들어 14. – joran

+0

지적 해 주셔서 감사합니다. 내가 생각하는 단어를 두 번 선택하는 것은 바람직하지 않습니다. – mathnoob

+0

이것은 [XY 문제] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)와 같은 느낌입니다.이 문제는'x' 문제에 대한'y' 해결책입니다. 토론하지 마라. 'rep()'접근 방식이 필요하지 않을 수도 있기 때문에 더 많은 배경을 제공하십시오. – Parfait

답변

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()를 사용합니다.

N < = 2M : 이중 첫 번째 (NM) 항목

2M < N

0

그래서 시퀀스는 길이 M의 현재 당신이 원하는 경우> M은, 당신은 이러한 가능성을 길이 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)))