6

次のネストされたループがあります。

for (x in xs) {
    for (y in ys) {
        # Do something with x and y
    }
}

これを平らにしたいので、2 つのベクトルのデカルト積を作成し、結果を反復処理することを考えxsましysた。Python では、これは簡単です。

for xy in product(xs, ys):
    # x, y = xy[0], xy[1]

しかし、R では、私が見つけた最も単純な等価物は気が遠くなるように見えます。

xys <- expand.grid(xs, ys)
for (i in 1 : nrow(xys)) {
    xy <- as.vector(xys[i, ])
    # x <- xy[1], y <- xy[2]
}

きっともっと良い方法があるはずですよね?(明確にするために、私はインデックスを反復処理したくありません…製品のタプルを直接反復処理する方法が必要だと思います。)

4

2 に答える 2

10

R には Python とは異なるパラダイムがあるため、ジェネレーターやタプルがあるとは思わないでください。そのためのベクトルとインデックスがあります。

このように、関数をデカルト積にマップするには、単純に呼び出します

outer(xs,ys,function(x,y) ...)

必要に応じて、結果を暗くしません。

編集:xsまたはysが基本ベクトルよりも複雑な場合、1 つのオプションはインデックスを使用することです。つまり、

outer(seq(a=xs),seq(a=ys),function(xi,yi) ... xs[[xi]]/ys[xi,]/etc. ...)

または、少し手作りの製品に機能をマッピングしますmapply

mapply(function(x,y) ...,xs,rep(ys,each=length(xs)))
于 2012-09-09T10:15:07.000 に答える
8

関数を使用してapply、データ フレームの各行に関数を適用できます。"your function"実際の関数に置き換えるだけです。

# example data
xs <- rnorm(10)
ys <- rnorm(10)    

apply(expand.grid(xs, ys), 1, FUN = function(x) {"your function"})

これは非常に基本的な例です。ここでは、行の両方の値の合計が計算されます。

apply(expand.grid(xs, ys), 1, FUN = function(x) {x[1] + x[2]})

インデックス ( , ) の代わりに名前付き引数 ( xs, )を使用するバリアントを次に示します。ysx[1]x[2]

myfun <- function(xs, ys) xs + ys
arguments <- expand.grid(xs = rnorm(10), ys = rnorm(10))
apply(arguments, 1, function(x)do.call(myfun, as.list(x)))
于 2012-09-09T10:18:59.343 に答える