これは、あなたが求めていると思うものに対するきちんとした解決策です。(わかりやすくするために、入力行列と呼んでいます。この例では、2 列と 10 行があり、行にはmat
abc1から abc10 までの名前が付けられています。)k
mat
以下のコードでは、結果out1
は計算したいもの (apply コマンドの結果) です。結果out2
は、作業中の行名を出力することを除いて、 と同じようout1
に出力されます (行ごとに 0.3 秒の遅延を入れたので、実際にこれを行うことがわかります。コードを完全に実行したい場合は、これを削除してください)明らかにスピード!)
私が思いついたトリックは、行番号 (1 から n) を の左側に cbind し (1mat
つの列を追加した行列を作成するため)、次にこれを使用して の行名を参照することでしmat
た。x = y[-1]
関数内の実際の計算 (ここでは 1 の追加) が行番号の最初の列を無視することを意味する行に注意してください。これは、 に対して行われる計算と同じであることを意味しout1
ます。行に対して実行したいどんな種類の計算も、この方法で実行できます。y
存在しなかったふりをして、 を使用して目的の計算を定式化するだけx
です。お役に立てれば。
set.seed(1234)
mat = as.matrix(data.frame(x = rpois(10,4), y = rpois(10,4)))
rownames(mat) = paste("abc", 1:nrow(mat), sep="")
out1 = apply(mat,1,function(x) {x+1})
out2 = apply(cbind(seq_len(nrow(mat)),mat),1,
function(y) {
x = y[-1]
cat("Doing row:",rownames(mat)[y[1]],"\n")
Sys.sleep(0.3)
x+1
}
)
identical(out1,out2)