私は2つのベクトルを持っています:
x = c(1,2,3)
y = c(4,5,2)
x
そして、の各要素にの各要素を掛けてy
、それをすべて合計したいと思います。だから私がやりたいのは、次のようなものです。
1*(4 + 5 + 2) + 2*(4 + 5 + 2) + 3*(4 + 5 + 2) = 11 + 22 + 33 = 66
ループなしでそれを行う方法はありますか?前もって感謝します
私は2つのベクトルを持っています:
x = c(1,2,3)
y = c(4,5,2)
x
そして、の各要素にの各要素を掛けてy
、それをすべて合計したいと思います。だから私がやりたいのは、次のようなものです。
1*(4 + 5 + 2) + 2*(4 + 5 + 2) + 3*(4 + 5 + 2) = 11 + 22 + 33 = 66
ループなしでそれを行う方法はありますか?前もって感謝します
これが私が使うものです!
sum(x) * sum(y)
# [1] 66
試す:
sum(x*sum(y))
[1] 66
ベクトル化された演算子はきちんとしています!
?mapply
また、これらの種類のタスクを実行するときに覚えておくと便利な関数です。例:
mapply("*",x,y)
... x [1] * y [1]、x [2] *y[2]などを実行して生成します
mapply("*",x,y)
[1] 4 10 6
次のような要約関数はsum
、次のように一方の側でも使用できます。
mapply("*",x,sum(y))
[1] 11 22 33
つまり、計算を行うための手間のかかる方法は次のようにもなります。
sum(mapply("*",x,sum(y)))
[1] 66
Joshとthelatemailの優れたアイデア以外の3つのアイデア:
sum(do.call("*", expand.grid(x, y)))
sum(outer(x, y)) ## or equivalently: sum(x %o% y)
sum(sapply(split(x, x), function(z) z * y))
を使用x %*% t(y)
して、必要な製品を含むマトリックスを取得し、マトリックスsum
内のすべてを一緒に追加するために使用できます。
sum(x %*% t(y))
#[1] 66
そして、これと同じアイデアのもう少し効率的なバージョン(Gavinに感謝)
sum(tcrossprod(x, y))
#[1] 66