30

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])))

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

4

5 に答える 5

34

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

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

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

于 2010-03-30T15:00:27.270 に答える
3

関数を無名にするのではなく名前を付けると、引数をより簡単に渡すことができます。を使用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)
于 2015-01-23T02:15:12.957 に答える
2

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

test^(1/row(test))

あなたが望むことをします、私は思います。row()機能はあなたが探しているものだと思います。

于 2010-03-31T15:27:11.227 に答える
2

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

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

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

于 2010-04-01T05:31:05.717 に答える