我有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]
,则会将它们切断,并且我不知道到底哪些和属于哪一组值。
答案 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)
我们可以使用aggregate
和rleid
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