在NA之后重新开始

时间:2014-02-07 12:43:01

标签: r cumsum

我有一个包含多列的数据框。对于一列,我想计算累积总和,但是我对丢失值有一些麻烦。

#sample data
test <- c(-1.2, 4.6, -8.3, 5, 8, 1, -2, NA, NA, NA, -3, 5.1, 1.9)
test <- as.data.frame(test)

#This gives NA after NAs occurred
sum_test <- lapply(test, FUN=cumsum)

sum_test
$test
 [1] -1.2  3.4 -4.9  0.1  8.1  9.1  7.1   NA   NA   NA   NA   NA   NA

#This continues with adding to pre-NA value after last NA
sum_test <- lapply(test, function(x) ave(x, is.na(x), FUN=cumsum))

sum_test
$test
 [1] -1.2  3.4 -4.9  0.1  8.1  9.1  7.1   NA   NA   NA  4.1  9.2 11.1

然而,我想要实现的是在NAs cumsum重新开始之后:

-1.2  3.4 -4.9  0.1  8.1  9.1  7.1   NA   NA   NA -3   2.1   4

可以这样做吗?

2 个答案:

答案 0 :(得分:5)

此处g定义了一个分组变量,然后我们将cumsum分别应用于每个组:

test <- c(-1.2, 4.6, -8.3, 5, 8, 1, -2, NA, NA, NA, -3, 5.1, 1.9)
g <- cumsum(is.na(head(c(0, test), -1)))
ave(test, g, FUN = cumsum)

给出:

[1] -1.2  3.4 -4.9  0.1  8.1  9.1  7.1   NA   NA   NA -3.0  2.1  4.0

已添加:请注意,head(c(0, test), -1)只是滞后test因此可以使用dplyr的lag函数来稍微缩短这一点:

library(dplyr)
ave(test, cumsum(is.na(lag(test))), FUN = cumsum)

答案 1 :(得分:3)

这应该可以解决问题:

test <- c(-1.2, 4.6, -8.3, 5, 8, 1, -2, NA, NA, NA, -3, 5.1, 1.9)
tmp <- rle(is.na(test))
ind <- rep(seq_along(tmp$value), tmp$lengths)
as.vector(unlist(tapply(test, ind, cumsum)))