R Репликация до тех пор, пока не будет достигнута длина

Скажем, у нас есть следующее:

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)

Есть ли у кого-нибудь предложение о том, как получить это или, возможно, ссылку на что-то подобное, заданное ранее? (Я не слишком уверен, какое ключевое слово искать)


person mathnoob    schedule 22.03.2017    source источник
comment
Вы можете сказать, что должно произойти, если желаемая длина слишком велика, скажем, 14.   -  person joran    schedule 22.03.2017
comment
Спасибо что подметил это; удвоение - плохой выбор слова, я думаю.   -  person mathnoob    schedule 22.03.2017
comment
Это похоже на XY-проблему, где это попытка y решения проблемы. x вы не обсуждаете. Предоставьте дополнительную информацию, так как подход rep() может не понадобиться.   -  person Parfait    schedule 22.03.2017
comment
Я пытаюсь извлечь N переменных из подмножества, но возможных переменных меньше N. Поэтому, чтобы компенсировать отсутствующие, я придаю больший вес существующим переменным, извлекая их больше. Это нечестный/элегантный способ, учитывая, что теперь они имеют разный вес, но это решает мою проблему.   -  person mathnoob    schedule 22.03.2017


Ответы (2)


Вы можете написать свою собственную функцию, чтобы сделать что-то вроде этого

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() для повторения каждого элемента определенное количество раз.

person MrFlick    schedule 22.03.2017

Итак, если ваша последовательность в настоящее время имеет длину 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)))
person Mark Reed    schedule 22.03.2017