Я искал решение, чтобы создать некоторую маску, с помощью которой я могу удалить некоторые данные (например, строки в data.frame) в зависимости от некоторых критериев, например:R: Удалить интервалы по критериям с допуском перекрытия
a <- c(0,0,0,3,5,6,3,0,0,0,4,5,8,5,0,0,0,0,0)
mask <- a == 0
mask
[1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
В моей реальной проблеме этот разрез слишком суровый, я хотел бы иметь более плавный переход. Идея: я хочу включить некоторые нули перед не-нулями, а также добавить некоторые нули после ненулевых. Простой подход: если у меня есть этот вектор, я хотел бы переключить каждый TRUE, расположенный рядом с FALSE, на FALSE, что добавляет перекрывающуюся область допуска к данным. Таким образом, вместо
a[!mask]
[1] 3 5 6 3 4 5 8 5
Я предпочел бы иметь что-то вроде
a[!mask]
[1] 0 3 5 6 3 0 0 4 5 8 5 0
или (увеличение размера окна допуска)
a[!mask]
[1] 0 0 3 5 6 3 0 0 0 4 5 8 5 0 0
В последнем случае трех нулей в середине возникают, поскольку допуски слева и справа начинают перекрываться. Мой вопрос: есть ли у кого хороший подход, как написать функцию для создания такой маски с перекрывающимся толерантностью?
[EDIT] Это мне какое-то время я понял ошибку в моем первоначальном вопросе (спасибо @tospig) В моем первоначальном посте я полностью сделал число нулей в средней части неправильным! Извините за путаницу. Итак, для уточнения: в случае окна допуска 1, действительно должно быть два нуля в середине: один из правой группы действительных данных, один из левого пучка действительных данных. Извините за беспорядок!
Итак, несмотря на действительно классный подход от @tospig (что я должен помнить), решение от @agenis отлично решает мою проблему!
Возрастающая часть допуска не ясна. Предположим, вы добавляете 3 нуля, это будет 4 нуля между ненулевыми номерами – akrun
Нет, максимальное количество нулей (как в данных) должно оставаться. В начальном примере есть три нуля, поэтому независимо от допуска, всегда должно быть это максимальное число из трех нулей. – Sosel
Тогда почему в первом случае есть только один ноль? Во всяком случае, мое решение дает первый случай. – akrun