以下のような数字の列があるとしましょう:
Y=
1
2
3
4
5
6
34
32
23
私は配列を持っていますR1 = (1,3,7,8)
R1で定義された添え字を利用して、Yの要素を追加したいと考えています。次のような値の配列を生成する必要があります。最初の要素として Y[1] から Y[3] までの数値の合計、2 番目の要素として Y[3] から Y[7] までの数値の合計、合計Y[7] から Y[8] までが 3 番目の要素などです。
以下のような数字の列があるとしましょう:
Y=
1
2
3
4
5
6
34
32
23
私は配列を持っていますR1 = (1,3,7,8)
R1で定義された添え字を利用して、Yの要素を追加したいと考えています。次のような値の配列を生成する必要があります。最初の要素として Y[1] から Y[3] までの数値の合計、2 番目の要素として Y[3] から Y[7] までの数値の合計、合計Y[7] から Y[8] までが 3 番目の要素などです。
この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
これを試してみてください。もっと良い方法があると確信しています。
まず、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)
y
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
これは@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
OK、ビットは必要ありません。私は退屈していました。
sapply(seq_along(R1[-1]), function(x) {
sum(Y[R1[x] : R1[x + 1]])
})
# [1] 6 52 66