1

假设我有一列数字,如下所示:

Y=
1
2
3
4
5
6
34
32
23

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

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

4

4 回答 4

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
于 2012-04-24T13:04:54.873 回答
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),因为我们需要在匿名函数中引用多个向量)并对yindexed by idx[[1]], byidx[[2]]等的元素求和:

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

这导致

> sums
[1]  6 52 66
于 2012-04-24T11:59:50.347 回答
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

编辑:

好的,你不需要那个do.call位。我很闷。

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

# [1]  6 52 66
于 2012-04-24T12:22:13.667 回答
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
于 2012-04-24T12:16:47.583 回答