考虑以下数据:
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。)
答案 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