web-dev-qa-db-ja.com

R:2つの変数のすべての要素にそれぞれ関数を適用します

2つの変数xとyを持つ関数があります。

fun1 <- function(x,y) {
  z <- x+y
  return(z)
}

関数はそれ自体で正常に機能します。

fun1(15,20)

しかし、適用関数を使用してxとyの2つのベクトルで使用しようとすると、正しい56 * 121配列が得られません。

Lx  <- c(1:56)
Ly <- c(1:121)

mapply(fun1, Lx, Ly)

私はあなたの助けと最速の解決策についてのアドバイスにも感謝します(例えば、適用するよりも速いdata.tableまたはdplyrソリューションです)。

7
adam.888

mapply()を使用する場合は、次のように、同じサイズの引数のn個のリストを提供する必要があります。これはn個ずつ関数に渡されます。

_mapply(fun1,c(1,2,3), c(4, 5, 6))
[1] 5 7 9
_

または、次のように1つの引数をスカラーにすることができます。

_mapply(fun1,c(1,2,3), 4)
[1] 5 6 7
_

LxLyのすべての組み合わせを使用しようとしているので、次のように1つのリストを繰り返し、次にもう1つのリストを繰り返すことができます。

_sapply(Lx, function(x) mapply(fun1,x,Ly))
_

または

_sapply(Ly, function(y) mapply(fun1,Lx,y))
_

rawr命題と同じ結果を生成します

_outer(Lx, Ly, fun1)
_

ここで、outer()ははるかに高速です

8
HubertL

さて、あなたは異なる長さのベクトルを使用していますが、私が正しく理解していれば、これはおそらく役立つでしょう。変数iを使ってダンビー関数を作成しました

fun1 <- function(x,y) {
  z <- x+y
  return(z)
}


fun1(15,20)


Lx  <- c(1:56)
Ly <- c(1:121)


fun1I <- function(x,y,i)
{


  fun1(x[i],y[i])


}


fun1IR <- function(x,y)
{


  function(i)fun1I(x=x,y=y,i=i) #return dumby function

}



testfun <- fun1IR(Lx,Ly) # creates function with data Lx and Ly in variable i

mapply(testfun, 1:min(length(Lx),length(Ly)))
0