2012-04-24 61 views
1

的总和可以说我有一列数字,如以下:ř计算一系列

Y= 
1 
2 
3 
4 
5 
6 
34 
32 
23 

我有一个数组R1 = (1,3,7,8)

我想实现通过使加入Y的元素使用R1中定义的下标。 我需要生成一个值的数组,例如:从Y [1]到Y [3]作为我的第一个元素的数字总和,从Y [3]到Y [7]作为第二个元素的数字总和,从Y [7]到Y [8]的总和作为我的第三个元素,依此类推。

+2

请查找如何'dput'工作 - 它会帮助你向我们提供的代码重现您示例数据。 – cbeleites 2012-04-24 12:23:04

回答

1

试试这个,但我确定有更好的方法。

首先,爆炸的r1到我们要总结在指数的向量:

idx <- sapply(seq_len(length(r1) - 1), 
       function(ind, x) seq(x[ind], x[ind+1], by = 1), 
       x = r1) 

这给了我们其组成成分指数的向量求和的列表:

> idx 
[[1]] 
[1] 1 2 3 

[[2]] 
[1] 3 4 5 6 7 

[[3]] 
[1] 7 8 

一旦我们有了这个,很容易sapply()那个(好吧,我们sapply()超过索引seq_along(idx),因为我们需要在匿名函数中引用多个向量)并且将的元素通过idx[[1]]索引,通过idx[[2]]等:

sums <- sapply(seq_along(idx), 
       function(ind, y, idx) sum(y[idx[[ind]]]), 
       y = y, idx = idx) 

导致

> sums 
[1] 6 52 66 
1

这里的另一种方式:

> startend <- cbind (head (R1, -1), tail (R1, -1)) 
> startend 
    [,1] [,2] 
[1,] 1 3 
[2,] 3 7 
[3,] 7 8 
> apply (startend, 1, function (i) sum (Y [i [1] : i [2]])) 
[1] 6 52 66 
+0

谢谢大家的好评。 – Probabilityman 2012-04-26 01:05:42

1

这是@cbeleites非常相似的答案(我首先通过类似的答案,这需要几分钟),但是避免创建startend对象:

sapply(seq_along(R1[-1]), function(x) { 
    sum(Y[do.call(":", as.list(R1[x + c(0, 1)]))]) 
}) 

# [1] 6 52 66 

编辑:

OK,你不需要do.call位。我很无聊。

sapply(seq_along(R1[-1]), function(x) { 
    sum(Y[R1[x] : R1[x + 1]]) 
}) 

# [1] 6 52 66 
5

embed功能是构建某种抵消一系列都是必须的有用:

embed(R1,2) 
    [,1] [,2] 
[1,] 3 1 
[2,] 7 3 
[3,] 8 7 
# So this becomes a simple one-liner: 
apply(embed(R1, 2) , 1, function(x) sum(Y[x[2]:x[1]])) 
#[1] 6 52 66