我如何模拟外部+列表?

时间:2014-05-27 21:18:27

标签: r outer-join

我想在所有参数组合上调用一个函数。 为此,我尝试了outer

> outer(c(0,6,7),c(100,10,1,0.1,0.01),FUN=list)
Error in outer(c(0, 6, 7), c(100, 10, 1, 0.1, 0.01), FUN = list) : 
  dims [product 15] do not match the length of object [2]

我可以使用嵌套的lapply得到我想要的东西:

do.call(c,lapply(c(0,6,7),function(type) 
  lapply(c(100,10,1,0.1,0.01),function(cost) 
    list(type=type,cost=cost)))

但我想知道是否有更好的解决方案(特别是如果我有两个以上的变量,比如epsilontype除了cost

3 个答案:

答案 0 :(得分:3)

如何使用expand.grid来获取所有组合。通用对任意数量的向量(参数)。然后,您可以使用apply。觉得有点乱,但做得好......

# stick your function in the apply loop
args <- expand.grid( c(0,6,7) , c(100,10,1,0.1,0.01) )
apply( args , 1 , function(x) x[1] * x[2] )

或者,data.table的交叉连接功能 - CJ功能(基本上与expand.grid完全相同)可以派上用场,同时还可以评估j的{​​{1}}中的函数...

data.table

答案 1 :(得分:0)

data.table的{​​{1}}做了类似的事情:

CJ

如果您希望使用CJ(type = c(0, 6, 7), cost = c(100, 10, 1, 0.1, 0.01)) type cost 1: 0 2e-02 2: 0 1e-01 3: 0 1e+00 4: 0 1e+01 5: 0 1e+02 6: 6 2e-02 7: 6 1e-01 8: 6 1e+00 9: 6 1e+01 10: 6 1e+02 11: 7 2e-02 12: 7 1e-01 13: 7 1e+00 14: 7 1e+01 15: 7 1e+02

,则可以将每行转换为列表

答案 2 :(得分:0)

您可以使用expand.gridmapply

tmp = expand.grid(c(0,6,7),c(100,10,1,0.1,0.01))
do.call(".mapply",   ##".mapply" seems handier for this since you don't have to specify each `...` argument
        c(function(x, y) list(type = x, cost = y), 
          list(unname(tmp)), 
          list(NULL)))