R複数のパラメーターを持つ関数を適用する


128

f(var1, var2)Rに関数があります。設定してvar2 = 1、その関数f()をリストに適用するとしますL。基本的に、出力を含む新しいリストL *を取得したい

[f(L[1],1),f(L[2],1),...,f(L[n],1)]

これをapplymapplyまたはのどちらで行うのlapplyですか?


回答:


190

適用関数の1つに追加の引数としてvar2を渡すだけです。

mylist <- list(a=1,b=2,c=3)
myfxn <- function(var1,var2){
  var1*var2
}
var2 <- 2

sapply(mylist,myfxn,var2=var2)

これはのvar2すべての呼び出しに同じことを渡しmyfxnます。代わりに、の各呼び出しでmyfxn1st / 2nd / 3rd / etcを取得したい場合。両方の要素mylistvar2、その後、あなたがにいるmapplyのドメイン。


5
しかし、ノートmyfxnケース1は、使用すべきでベクトル化することができる、myfxn(unlist(mylist), var2=var2)
バティスト

元の例は不明確でしたが、ベクトル化されていないようです。とはいえ、ポイントはよく取れています。
アリB.フリードマン

この機能を「オンザフライ」で機能させる方法はありますか?次のようなものsapply(mylist, function(var1, var2) { var1*var2 }, var=thisvar2)ですが、引数2が複数の正式な引数と一致するというエラーが発生します
emudrak

1
@emudrak問題は、渡す引数にではvarなく、名前を付けているということですvar2。Rはあなたが何を意味するのかを理解できません。
アリB.フリードマン

49

関数に2つのベクトル変数があり、その値ごとに計算する必要がある場合(@Ari B. Friedmanが言及)mapply、次のように使用できます。

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
mapply(mult_one,vars1,vars2)

あなたに与える:

> mapply(mult_one,vars1,vars2)
[1] 10 40 90

3
単純で明確な例であっても、一般化への賛成票は1つです。
JASC 2018

mapplyvars1要素が1つしかない場合もリサイクルされます。たとえばvars1 <- 3mapply(mult_one, vars1, vars2)はを返します30 60 90。これはlapply、関数の2番目の引数に対して使用する場合に役立ちます。
Paul Rougieux

3

@Alexanderの例をさらに一般化outerすることは、関数がベクトル値の各ペアで自身を計算する必要がある場合に関連します。

vars1<-c(1,2,3)
vars2<-c(10,20,30)
mult_one<-function(var1,var2)
{
   var1*var2
}
outer(vars1,vars2,mult_one)

与える:

> outer(vars1, vars2, mult_one)
     [,1] [,2] [,3]
[1,]   10   20   30
[2,]   20   40   60
[3,]   30   60   90
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.