获取向量的多个/分组总和,其值由NA分开

时间:2018-08-09 09:51:15

标签: r vector sum

我有previous question的最新消息:

c(123, 4525, 4365, 234, 674, NA, NA, NA, NA, NA, NA, NA, 
  24, 347, 457, 3246, 234, 5, 346, NA, NA, NA, NA, NA, NA) # [... and so on]

有什么办法让我得到我的资产净值(NA)所分隔的每组价值的总和?值和NA在向量上的长度都是分开的,这就是我看到的问题...

Ronak Shah的回答非常有帮助,但仍然存在一个问题: 我有一些值,总和等于0。 但这对我来说是重要的信息!
因此,如果我使用new[new != 0],则会将它们切断,并且我不知道到底哪些和属于哪一组值。

3 个答案:

答案 0 :(得分:1)

您可以使用data.table::rleid

library(data.table)
tapply(x[!is.na(x)], rleid(is.na(x))[!is.na(x)], sum)
#    1    3    5    7    9 
# 9921 4659 5289    0    0 

答案 1 :(得分:0)

这可能有点令人费解。逻辑是合理的,但是很有可能可以稍微简化一下。

c(123, 4525, 4365, 234, 674, NA, NA, NA, NA, NA, NA, NA, 24, 347, 457, 3246,
234, 5, 346, NA, NA, NA, NA, NA, NA, 45, 778, 986, 3345, 135, NA, NA, NA, NA,
0, 0, NA, NA, 99, -2, -97, NA, NA) -> x

isna <- !is.na(x)
ix <- c(0, diff(isna)) + isna
ix[ix == 1] <- 0
ix <- cumsum(ix) + 1

ix <- ix * as.integer(isna)

sapply(split(x, ix)[-1], sum)
#    1    2    3    4    5 
# 9921 4659 5289    0    0 

发生的事情是,我通过各种逻辑和算术运算创建了一个索引,该索引具有与每个非nas运算对应的唯一编号。然后沿着该索引分割向量,并对每个结果元素求和。


从穆迪那里得到启发,这是一个基于rle()的解决方案

notnaruns <- function(x) {
    notna <- !is.na(x)
    notnarl <- rle(isna)$lengths
    repruns <- rep(1:length(notnarl), notnarl) + 1
    repruns * notna * 0.5
}

tapply(x, notnaruns(x), sum)[-1]
#    1    2    3    4    5 
# 9921 4659 5289    0    0 

答案 2 :(得分:0)

我们可以使用aggregaterleid

library(data.table)
i1 <- is.na(x)
aggregate(cbind(val = x[!i1])~ cbind(grp = rleid(i1)[!i1]), FUN = sum)
#  grp  val
#1   1 9921
#2   3 4659
#3   5 5289
#4   7    0
#5   9    0