Убрать режимы индикатора, которые меньше трех периодов

Я ищу помощь по следующей проблеме.

Предположим, у меня есть переменная индикатора:

ind <- c(0,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,1,0)

Моя переменная индикатора намного длиннее, так что это не особая проблема.

Я заинтересован в написании цикла, который делает следующее:

если последовательность 1 в векторе выше чем 3, держите это ноль.

Т.е. я хочу убрать частые смены режимов, где 1 - это всего 1 или два периода.

Таким образом, конечный вектор должен выглядеть следующим образом:

ind <- c(0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0)

Любая помощь в создании этой динамики будет оценена!

Nic

1 ответ

Решение

Мы можем использовать rle сделать это. Мы получаем rle из "ind", измените "значения" путем поднабора "длины" меньше 3 для значений, которые 1 (!!values), присвойте соответствующие "значения" 0 и используйте inverse.rle преобразовать вывод в vector,

inverse.rle(within.list(rle(ind), values[!!values][lengths[!!values]<3] <- 0))
#[1] 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0

Или более компактная версия

inverse.rle(within.list(rle(ind), values[values & lengths<3] <- 0))
# [1] 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0
Другие вопросы по тегам