Учитывая вектор, такой какR функция респ с перезаписать элементами
> x
[1] 1 1 2 1 1 1 5 1 1 1 5 7 1 1 1 1 1 1 1 1 1
Я хочу повторить элементы п раз --BUT-- Я хочу, чтобы старые элементы, которые будут перезаписаны репликаций. Используя основные функции респ дает:
> rep(x,x)
[1] 1 1 2 2 1 1 1 5 5 5 5 5 1 1 1 5 5 5 5 5 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1
это просто сдвигая оригинальные ип смещенной соседние элементы вправо. Но если бы я неоднократно перезаписывать каждый из соседних элементов с тиражируемых значений (шаг за шагом здесь с слева направо замены каждого элемента), я бы что-то вроде ...
112111511157111111111
112211511157111111111
112211555557111111111
112211555555555111111
112211555557777777111
Обратите внимание, для каждого N-реплицируемого элемента он просто перезаписывает N соседних правых соседей. Я мог бы сделать это в цикле, но есть ли быстрый векторный подход для этого?
na.locf близок (предварительно устанавливает 1s в NA), но (как я понимаю) он заполнит ВСЕ или фиксированное число только самых правых NA с значением rep, а не точно N правыми соседями.
Возможной альтернативой может быть наличие всех нулей вместо исходных и только повторение и перезапись элементов N раз с двоичными значениями. , например. выше будет ... например:
x<- c(0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0)
sig<-c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0)
редактировать: для уточнения, оно должно компактно распространяться на любое количество повторяемых элементов (те же функции, как репы).
для первой задачи, некоторые умные комбинации 'embed',' inverse.rle' и индексирование, возможно, но не сегодня для меня. – baptiste
Я даже не знал, что могу инвертировать rle. Спасибо за указатель. – pat
x длина 21 ваш ответ длина 22. если это «001100111111111111000», длина 21? – user1609452