Cumsum 通过重置忽略 NA
Cumsum ignoring NA's with reset
我有条件总和,重置为零。
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
的最长长度应为三个。如果超过三个,则它们应保持为 NA
s,并且函数应从最后一个非 NA
继续。
关于同一主题存在一些答案,但我不确定如何将它们放在一起。
谢谢
由于 NA
在求和时被视为零,但它们被分组为就好像它们具有与先前值相同的值一样,您可以根据值中的逻辑对 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
使用 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
}
我有条件总和,重置为零。
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
的最长长度应为三个。如果超过三个,则它们应保持为NA
s,并且函数应从最后一个非NA
继续。
关于同一主题存在一些答案,但我不确定如何将它们放在一起。
谢谢
由于 NA
在求和时被视为零,但它们被分组为就好像它们具有与先前值相同的值一样,您可以根据值中的逻辑对 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
使用 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
}