的總和可以說我有一列數字,如以下:ř計算一系列
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]的總和作爲我的第三個元素,依此類推。
的總和可以說我有一列數字,如以下:ř計算一系列
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]的總和作爲我的第三個元素,依此類推。
試試這個,但我確定有更好的方法。
首先,爆炸的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
這裏的另一種方式:
> 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
謝謝大家的好評。 – Probabilityman 2012-04-26 01:05:42
這是@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
的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
請查找如何'dput'工作 - 它會幫助你向我們提供的代碼重現您示例數據。 – cbeleites 2012-04-24 12:23:04