たとえばy <- rbind(c(1,0,0), c(0,1,0), c(0,1,0))
、すべての行がゼロと1つの行で構成される行列があり、各行のインデックスを保持するベクトルがx <- c(1,2,3)
あります。ここで、y[i,x[i]] == 1
保持された回数を数えたいと思います。私は私がこれをすることができることを知っています
count <- 0
for(i in 1:3)
count <- count + y[i, x[i]]
しかし、もっと賢い方法があるかどうか興味がありました。のようなものcount <- sum(y[,x])
。もちろん、これは機能しませんy[,x]
。なぜなら、行列を与えるからです。
したがって、私の質問は、applyまたは他のスマートトリックを使用して、つまりfor
ループなしで、別のベクトルによって指定された位置に要素を持つベクトルを取得する方法がありますか?
私はすでにこれを探していましたが、これを呼び出す方法が本当にわからないため、有用なものは何も見つかりませんでした。この質問がすでにどこかにぶら下がっている場合はお詫びします...
row/column
インデックスを使用して、「x」および「y」インデックスに対応する要素を抽出し、sum
sum(y[cbind(1:nrow(y), x)])
#[1] 2
値が1と異なる場合
sum(y[cbind(1:nrow(y), x)]==1)
またはこの場合、
sum(diag(y)==1)
#[1] 2
または
sum(y*diag(y))
編集:コメントに従って、行/列のインデックスをからcbind(x,1:ncol(y))
に変更しましたcbind(1:nrow(y), x)
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加