【问题标题】:Cumsum ignoring NA's with resetCumsum 通过重置忽略 NA
【发布时间】:2017-02-09 14:31:15
【问题描述】:

我有条件总和,重置为零。

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 不能用零(或一)代替,
  • 向量必须保持相同的长度(因此排除不是一个选项)
  • 连续忽略NAs 的最长长度应为三。如果超过三个,则它们应保持为NAs,并且功能应从最后一个非NA 继续。

在同一个主题上存在一些答案,但我不知道如何将它们放在一起。
谢谢

【问题讨论】:

  • zoo?na.locf
  • 当有 4 个连续的 NA 值时需要发生什么?
  • "连续忽略的 NA 的最长长度应为 3。" -- 您可能应该扩展您的示例,以便此条件真正重要。

标签: r cumsum


【解决方案1】:

使用 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
}

【讨论】:

  • 看起来不错,只是在达到 >3 个缺失值后不会中断。
  • 您需要指定“中断”的含义。向量是否在 3 个 NA 之前结束?还是别的什么?
【解决方案2】:

由于NAs 在求和时被视为零,但它们被分组为好像它们与以前的值具有相同的值,您可以根据 @ 中的值变量和组变量中的逻辑不同地对待 NA 987654323@:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多