web-dev-qa-db-ja.com

'apply'関数の行/列カウンター

関数をapply、つまり行列の各行に使用したいが、この関数の引数としてその行の番号を使用したい場合はどうでしょうか。例として、行列の各行の数値のn乗根を取得したいとします。nは行番号です。このように、行番号を初期マトリックスに列バインドする以外の方法(applyのみを使用)はありますか?

_test <- data.frame(x=c(26,21,20),y=c(34,29,28))

t(apply(cbind(as.numeric(rownames(test)),test),1,function(x) x[2:3]^(1/x[1])))
_

P.S.実際、testが本当に行列だった場合:test <- matrix(c(26,21,20,34,29,28),nrow=3)、rownames(test)は役に立ちません:(ありがとう。

28
Brani

私が通常行うことは、sapplyの代わりに行番号1:nrow(test)testを実行し、関数内でtest[i,]を使用することです。

t(sapply(1:nrow(test), function(i) test[i,]^(1/i)))

しかし、これが本当に効率的かどうかはわかりません。

31
Aniko

関数に匿名にするのではなく名前を付けると、引数をより簡単に渡すことができます。 nrowを使用して行数を取得し、この方法でインデックスを作成するフレームとともに、行番号のベクトルをパラメーターとして渡すことができます。

わかりやすくするために、別の関数例を使用しました。この例では、2列の行列に対して列xと列yを乗算します。

test <- data.frame(x=c(26,21,20),y=c(34,29,28))
myfun <- function(position, df) {
    print(df[position,1] * df[position,2])
}

positions <- 1:nrow(test)
lapply(positions, myfun, test)
3
Scott C Wilson

実際、行列の場合、applyも必要ありません。ただ:

_test^(1/row(test))
_

あなたがやりたいことをする、と私は思います。 row()関数はあなたが探しているものだと思います。

2

行番号をcbind()することは、非常に簡単なアプローチのようです。マトリックス(またはデータフレーム)の場合、以下が機能するはずです。

apply( cbind(1:(dim(test)[1]), test), 1, function(x) plot(x[-1], main=x[1]) )

またはあなたがプロットしたいものは何でも。

2
Ian Saunders

私は少し混乱しているので、これを間違えた場合はすみませんが、行列の各行の数値のn乗根を計算したい場合(n =行番号)。この場合、非常に簡単に、元の配列と同じ次元で新しい配列を作成し、各列の値は対応する行番号と同じになります。

test_row_order = array(seq(1:length(test[,1]), dim = dim(test))

次に、関数(この場合はn番目のルート)を適用するだけです。

n_root = test^(1/test_row_order)
0
Green.River