6

我有以下嵌套循环:

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

我想将其展平,所以我想构建两个向量的笛卡尔积xsys迭代结果。在 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) ...)

如果你愿意,可以取消结果。

编辑:如果xsys比基向量更复杂,一种选择是使用索引,即

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, ys) 而不是索引 ( 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)))
于 2012-09-09T10:18:59.343 回答