Убрать режимы индикатора, которые меньше трех периодов
Я ищу помощь по следующей проблеме.
Предположим, у меня есть переменная индикатора:
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