2017-02-09 121 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 s不能用零(或一個)來代替,
  • 矢量必須保持相同的長度(因此不包括不是一個選項)
  • 最長連續忽略的長度爲NA s應爲3。如果它超過三個,那麼它們應該保持爲NA s,功能應該從最後一個非NA繼續。

一些答案存在於同一個主題,但我不知道如何把它放在一起。
感謝

+0

採取從'zoo'看看'na.locf'?。 – ytk

+0

當有4個連續的「NA」值時需要發生什麼? – Wietze314

+0

「連續被忽略的NAs的最長長度應該是三個」。 - 你應該擴展你的例子,以便這個條件真正重要。 – 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的視爲零,您可以採用不同基於內ave在價值變量和組變量的邏輯對待NA

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