首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在忽略NA值的情况下计算cumsum()

在忽略NA值的情况下计算cumsum()
EN

Stack Overflow用户
提问于 2014-08-30 05:14:28
回答 4查看 28.5K关注 0票数 44

考虑以下命名向量x

代码语言:javascript
复制
( x <- setNames(c(1, 2, 0, NA, 4, NA, NA, 6), letters[1:8]) )
# a  b  c  d  e  f  g  h 
# 1  2  0 NA  4 NA NA  6 

我想在忽略NA值的情况下计算x的累积和。许多R函数都有一个参数na.rm,用于在计算之前删除NA元素。cumsum()不是其中之一,这使得这个操作有点棘手。

我可以这样做。

代码语言:javascript
复制
y <- setNames(numeric(length(x)), names(x))
z <- cumsum(na.omit(x))
y[names(y) %in% names(z)] <- z
y[!names(y) %in% names(z)] <- x[is.na(x)]
y
# a  b  c  d  e  f  g  h 
# 1  3  3 NA  7 NA NA 13 

但这看起来有点过了,而且做了很多新的赋值/复制。我相信有更好的办法。

有什么更好的方法可以返回累积和,同时有效地忽略 NA 值?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-30 05:21:04

你想要这样的东西吗:

代码语言:javascript
复制
x2 <- x
x2[!is.na(x)] <- cumsum(x2[!is.na(x)])

x2

或者编辑,正如上面的注释所建议的,您可以将NA更改为0-

代码语言:javascript
复制
miss <- is.na(x)
x[miss] <- 0
cs <- cumsum(x)
cs[miss] <- NA
# cs is the requested cumsum
票数 27
EN

Stack Overflow用户

发布于 2014-08-30 06:15:22

您可以在一行代码中完成此操作:

代码语言:javascript
复制
cumsum(ifelse(is.na(x), 0, x)) + x*0
#  a  b  c  d  e  f  g  h 
#  1  3  3 NA  7 NA NA 13

或者,类似地:

代码语言:javascript
复制
library(dplyr)
cumsum(coalesce(x, 0)) + x*0
#  a  b  c  d  e  f  g  h 
#  1  3  3 NA  7 NA NA 13 
票数 36
EN

Stack Overflow用户

发布于 2018-07-10 22:35:34

这是一个老问题,但tidyr给出了一个新的解决方案。基于将NA替换为零的思想。

代码语言:javascript
复制
require(tidyr)

cumsum(replace_na(x, 0))

 a  b  c  d  e  f  g  h 
 1  3  3  3  7  7  7 13 
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25576358

复制
相关文章

相似问题

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