考虑以下命名向量x
。
( 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()
不是其中之一,这使得这个操作有点棘手。
我可以这样做。
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
值?
发布于 2014-08-30 05:21:04
你想要这样的东西吗:
x2 <- x
x2[!is.na(x)] <- cumsum(x2[!is.na(x)])
x2
或者编辑,正如上面的注释所建议的,您可以将NA更改为0-
miss <- is.na(x)
x[miss] <- 0
cs <- cumsum(x)
cs[miss] <- NA
# cs is the requested cumsum
发布于 2014-08-30 06:15:22
您可以在一行代码中完成此操作:
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
或者,类似地:
library(dplyr)
cumsum(coalesce(x, 0)) + x*0
# a b c d e f g h
# 1 3 3 NA 7 NA NA 13
发布于 2018-07-10 22:35:34
这是一个老问题,但tidyr
给出了一个新的解决方案。基于将NA
替换为零的思想。
require(tidyr)
cumsum(replace_na(x, 0))
a b c d e f g h
1 3 3 3 7 7 7 13
https://stackoverflow.com/questions/25576358
复制相似问题