expand.grid的动态参数

nic*_*ico 7 combinations r

expand.grid用来生成向量的所有元素对,例如:

v <- 1:3
expand.grid(v,v)
Run Code Online (Sandbox Code Playgroud)

这使:

  Var1 Var2
1    1    1
2    2    1
3    3    1
4    1    2
5    2    2
6    3    2
7    1    3
8    2    3
9    3    3
Run Code Online (Sandbox Code Playgroud)

现在,说我想要同样的东西,但我使用的是三胞胎

expand.grid(v,v,v)
Run Code Online (Sandbox Code Playgroud)

我如何将其推广到n元组,以便我可以使用new.expand.grid(v,5)并获得结果expand.grid(v,v,v,v,v)

A5C*_*2T1 12

expand.grid可以采取一个list输入,那么呢replicate

expand.grid(replicate(3, v, simplify=FALSE))
Run Code Online (Sandbox Code Playgroud)

为了好玩,作为一个功能(虽然我知道你会知道如何做到这一点):

new.expand.grid <- function(input, reps) {
  expand.grid(replicate(reps, input, simplify = FALSE))
}

new.expand.grid(c(1, 2), 4)
#    Var1 Var2 Var3 Var4
# 1     1    1    1    1
# 2     2    1    1    1
# 3     1    2    1    1
# 4     2    2    1    1
# 5     1    1    2    1
# 6     2    1    2    1
# 7     1    2    2    1
# 8     2    2    2    1
# 9     1    1    1    2
# 10    2    1    1    2
# 11    1    2    1    2
# 12    2    2    1    2
# 13    1    1    2    2
# 14    2    1    2    2
# 15    1    2    2    2
# 16    2    2    2    2
Run Code Online (Sandbox Code Playgroud)


Fra*_*ank 5

do.call 是将动态参数集传递给函数的标准方法:

new.expand.grid <- function(vec,nrep) do.call(expand.grid,rep(list(vec),nrep))
Run Code Online (Sandbox Code Playgroud)

例: new.expand.grid(letters[1:2],4)

   Var1 Var2 Var3 Var4
1     a    a    a    a
2     b    a    a    a
3     a    b    a    a
4     b    b    a    a
5     a    a    b    a
6     b    a    b    a
7     a    b    b    a
8     b    b    b    a
9     a    a    a    b
10    b    a    a    b
11    a    b    a    b
12    b    b    a    b
13    a    a    b    b
14    b    a    b    b
15    a    b    b    b
16    b    b    b    b
Run Code Online (Sandbox Code Playgroud)

  • 关于`do.call`的观点,但我认为在这种情况下这是过分的。`expand.grid(rep(list(v),4))`就足够了。我猜想仅仅对我们的答案中的rep和replicate部分进行基准测试,就会发现rep方法更快。 (2认同)