2017-02-09 9 views
2

У меня есть условная сумма с сбросом на ноль.Cumsum игнорирует NA с сбросом

criteria1 <- c(rep(0,2), rep(1,5), rep(0,3), rep(1,6),rep(0,2)) 
criteria1[c(6,9,12,13,14,15)] <- NA 

#cumsum function, working before the first NA 
ave(criteria1, cumsum(criteria1 == 0), FUN = cumsum) 
[1] 0 0 1 1 1 NA 1 0 NA 0 1 NA NA NA NA 1 0 0 

#and desired output would be 
#NA's are replaced with the last value accumulated 
#if more than three leave NA's in 
0 0 1 2 3 3 4 0 0 0 1 NA NA NA NA 2 0 0 

Некоторые условия:

  • NA ы не может быть заменен на ноль (или один),
  • вектор должен оставаться такой же длины (так, за исключением не вариант)
  • длинный длина последовательных игнорируемых NA s должна быть три. Если его больше трех, то они должны оставаться как NA s, и функция должна продолжаться от последнего не NA.

Некоторые ответы существуют по одной и той же теме, но я не уверен, как собрать все это вместе.
Благодаря

+0

Посмотрите на '' na.locf' из zoo'?. – ytk

+0

, что должно произойти, когда есть 4 последовательных значения 'NA'? – Wietze314

+0

«Самая длинная длина последовательных игнорируемых НС должна быть три». - вы, вероятно, должны расширить свой пример, чтобы это действительно имело значение. – Frank

ответ

3

С R базы вы можете сделать: генерировать данные

criteria1 <- c(rep(0,2), rep(1,5), rep(0,3), rep(1,6),rep(0,2)) 
criteria1[c(6,9,12,13)] <- NA 

получить результат

l <- length(criteria1) 
cum <- cumsum(ifelse(!is.na(criteria1),criteria1,0)) 
zero <- which(criteria1 == 0) 

res <- cum - rep(cum[zero], c(zero[2:length(zero)],l+1)-zero) 

опциональное решение dplyr:

res <- cum - rep(cum[zero], dplyr::coalesce(dplyr::lead(zero),l+1L)-zero) 

определять и изменять повторы NA> 3 раза

NAs <- rle(is.na(criteria1)) 
NAloc <- which(NAs$lengths > 3 & NAs$values == 1) 
for(i in NAloc) 
{ 
res[seq(sum(NAs$lengths[1:(i-1)])+1,sum(NAs$lengths[1:i]))] <- NA 
} 
+0

Выглядит неплохо, он просто не сломается после достижения> 3 недостающих значений. –

+0

Вам нужно указать, что вы подразумеваете под словом «break». Остается ли вектор до 3 NA? Или что-то другое? – Wietze314

+0

Я добавил код для повторных значений NA – Wietze314

2

С NA s рассматривается как ноль, когда суммируются, но они сгруппированы так, как будто они имеют такое же значение, как предыдущие значения, вы можете обращаться NA по-разному на основе логики в переменной переменном значении и группы в ave :

library(data.table); library(dplyr); library(zoo); 

ave(coalesce(criteria1, 0), rleid(na.locf(criteria1 != 0)), FUN = cumsum) 
# [1] 0 0 1 2 3 3 4 0 0 0 1 1 1 2 3 4 0 0