Iterate over cartesian product of vectors

后端 未结 2 705
感情败类
感情败类 2021-01-02 22:18

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

相关标签:
2条回答
  • 2021-01-02 22:48

    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)))
    
    0 讨论(0)
  • 2021-01-02 22:53

    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)))
    
    0 讨论(0)
提交回复
热议问题