Iterate over cartesian product of vectors

岁酱吖の 提交于 2019-11-29 20:26:24

问题


I have the following nested loop:

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

Which I’d like to flatten so I thought of building a Cartesian product of the two vectors xs and ys and iterating over the result. In Python, this would be trivial:

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

But in R, the simplest equivalent I’ve found looks daunting:

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

Surely there must be a better way, no? (To clarify, I don’t want to iterate over an index … I think there must be a way to directly iterate over the tuples in the product.)


回答1:


You can use the apply function to apply a function to each row of your data frame. Just replace "your function" with your actual function.

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

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

This is a very basic example. Here, the sum of both values in a row is calculated:

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

Here is a variant that uses named arguments (xs, ys) instead of indices (x[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)))



回答2:


R has a different paradigm than Python, so don't expect it to have generators or tuples -- we have vectors and indices for that.

This way, to map a function on a Cartesian product simply call

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

and undim the result if you wish.

EDIT: In case xs or ys are something more complex than base vectors, one option is to use indices, i.e.

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

or map a function on a bit hand-crafted product using mapply

mapply(function(x,y) ...,xs,rep(ys,each=length(xs)))


来源:https://stackoverflow.com/questions/12338092/iterate-over-cartesian-product-of-vectors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!