2

最初の列にls、2番目の列にheihtsの重みを持つ次の行列があるとします。

> wgt.hgt.matrix
     [,1] [,2]
[1,]  180   70
[2,]  156   67
[3,]  128   64
[4,]  118   66
[5,]  202   72

私はこれを次のようなバイナリ関数を適用するための簡潔な方法を探しています

function(lb, inch) { (lb/inch**2)*703 } -> bmi

行列の各行に、結果として5つのBMI値を持つ配列、リスト、またはベクトルが生成されます。私が見つけた1つの方法は、apply関数を使用します。

apply(wgt.hgt.matrix, 1, function(row) bmi(row[1], row[2]))

ただし、Ruby(*)のようなsplat演算子を使用すると、呼び出しをより簡潔かつ明確にすることができます。

apply(wgt.hgt.matrix, 1, function(row) bmi(*row))

splat演算子に相当するものが存在しますか?つまり、引数リストに入力するためにすべてのベクトルのようなオブジェクトを分割するようにRに指示する構文要素がありますか?他に、より単純で簡潔なapply電話の提案はありますか?

4

3 に答える 3

1

おそらく私は何かを見逃していますが、何が問題なのですか:

wgt.hgt.matrix <-
  structure(c(180L,156L,128L,118L,202L,70L,67L,64L,66L,72L), .Dim=c(5L,2L))
bmi <- function(lb, inch) (lb/inch**2)*703
bmi(wgt.hgt.matrix[,1], wgt.hgt.matrix[,2])

アップデート:

OPのコメントに基づいて、do.callより一般的に機能するようです:

# put each matrix column in a separate list element
lc <- lapply(1:ncol(wgt.hgt.matrix), function(i) wgt.hgt.matrix[,i])
# call 'bmi' with one argument for each column / list element
do.call(bmi, lc)
于 2012-05-30T14:25:04.797 に答える
0

ジョシュアの回答に示されているように、すべてのベクトル化された演算子があるため、bmi() 関数をベクトル化されたソリューションとして使用することをお勧めします。次の方法でもこれを行うことができます。

colnames(wgt.hgt.matrix) <- c("lb", "inch")
with( as.data.frame(wgt.hgt.matrix), bmi(lb,inch) )
# [1] 25.82449 24.43039 21.96875 19.04362 27.39313

残念ながら、マトリックスは「with」を使用して環境を構築するための適切な基盤ではないため、上記ではデータフレームへの強制が必要でした。(上記で作成したように) 名前付き要素を持つベクトルを取得するように書き直された bmi() のバージョンで動作する解決策 (ベクトル化されたアプローチよりも時間効率が低くなります) を得ることができます。apply

 bmi <- function(vec) { (vec['lb']/vec['inch']**2)*703 }
 apply(wgt.hgt.matrix, 1, function(row)  bmi(row ) )
# [1] 25.82449 24.43039 21.96875 19.04362 27.39313
于 2012-05-30T18:40:43.160 に答える
0

do.call を使用すると、探している構文にかなり近づくことができます。

## Setup
wgt.hgt.matrix=matrix(c(180,70,156,67,128,64,118,66,202,72),ncol=2,byrow=TRUE)
bmi = function(lb, inch) { (lb/inch**2)*703 }
## The action
apply(wgt.hgt.matrix, 1, function(row) do.call(bmi,as.list(row)))

do.call() は実際には、リスト名を使用して引数名を指定できるという点で、単なるスプラット演算子よりも柔軟です。

于 2012-12-03T02:15:57.757 に答える