首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cumsum忽略NA的重置

Cumsum忽略NA的重置
EN

Stack Overflow用户
提问于 2017-02-09 14:31:15
回答 2查看 865关注 0票数 2

我有条件和,重置在零。

代码语言:javascript
复制
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

一些条件:

  • NAs不能替换为0(或1),
  • 向量必须保持相同的长度(因此排除不是一种选择)
  • 连续被忽略的NA的最长长度应该是3。如果它超过三个,那么它们应该保持为NAs,函数应该从最后一个非NA继续。

在同一主题上有一些答案,但我不知道如何把它们放在一起。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-09 14:47:59

使用R基,您可以完成:生成数据

代码语言:javascript
复制
criteria1 <- c(rep(0,2), rep(1,5), rep(0,3), rep(1,6),rep(0,2))
criteria1[c(6,9,12,13)] <- NA

得到结果

代码语言:javascript
复制
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解决方案:

代码语言:javascript
复制
res <- cum - rep(cum[zero], dplyr::coalesce(dplyr::lead(zero),l+1L)-zero)

检测和改变NA >3次重复

代码语言:javascript
复制
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
}
票数 4
EN

Stack Overflow用户

发布于 2017-02-09 14:47:32

由于NAs在求和时被视为零,但分组时它们的值与以前的值相同,因此您可以根据ave中的值变量和组变量中的逻辑对NA进行不同的处理。

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42139352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档