如何计算满足条件的连续数的总和?

时间:2017-10-17 09:28:28

标签: r

考虑以下数据:

dataset <- c(0.5, 1.2, 1.5, 2.1, 2.0, 0.8, 1.4, 0, 2.4, 2.9, 2.9, 2.7, 1.4, -0.8, -0.4, -0.2)

如何对连续的大于1的条目求和?

1.2+1.5+2.1+2.0
1.4
2.4+2.9+2.9+2.7+1.4

(这个问题是closed on CV。)

2 个答案:

答案 0 :(得分:6)

以下是cumsum

的选项
i1 <- dataset <1
tapply(dataset[!i1], cumsum(i1)[!i1], FUN = sum)
#   1    2    3 
# 6.8  1.4 12.3 

答案 1 :(得分:1)

为符合&gt; 1:

条件的条目提取运行长度编码
foo <- rle(dataset>1)

现在我们需要标记不同的运行。我们将值&lt; = 1的运行标记为“0”,并通过增加整数标记所有那些&gt; 1:

foo$values <- as.numeric(foo$values)
foo$values[foo$values>0] <- 1:sum(foo$values[foo$values>0])

我们现在回溯这个以获得正确的标签。查看index以了解发生的情况:

index <- inverse.rle(foo)
cbind(dataset,index)

我们最终通过不同的索引值对值进行求和(并忽略索引为0的值,因为它将&lt; = 1的条目相加):

by(dataset,index,sum)[-1]

输出:

> cbind(dataset,index)
      dataset index
 [1,]     0.5     0
 [2,]     1.2     1
 [3,]     1.5     1
 [4,]     2.1     1
 [5,]     2.0     1
 [6,]     0.8     0
 [7,]     1.4     2
 [8,]     0.0     0
 [9,]     2.4     3
[10,]     2.9     3
[11,]     2.9     3
[12,]     2.7     3
[13,]     1.4     3
[14,]    -0.8     0
[15,]    -0.4     0
[16,]    -0.2     0

> by(dataset,index,sum)[-1]
index
   1    2    3 
 6.8  1.4 12.3