expand.grid 的动态参数

Posted

技术标签:

【中文标题】expand.grid 的动态参数【英文标题】:Dynamic arguments to expand.grid 【发布时间】:2013-10-24 22:22:53 【问题描述】:

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

v <- 1:3
expand.grid(v,v)

这给出了:

  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

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

expand.grid(v,v,v)

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

【问题讨论】:

【参考方案1】:

expand.grid 可以将list 作为其输入,那么replicate 呢?

expand.grid(replicate(3, v, simplify=FALSE))

为了好玩,作为一个函数(虽然我知道你会知道怎么做):

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

【讨论】:

太棒了!我真的没想过这样做!【参考方案2】:

do.call 是将一组动态参数传递给函数的标准方式:

new.expand.grid <- function(vec,nrep) do.call(expand.grid,rep(list(vec),nrep))

例如: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

【讨论】:

关于do.call 的观点,但我认为在这种情况下它是矫枉过正的。 expand.grid(rep(list(v), 4)) 就足够了。我猜想只对我们答案中的repreplicate 部分进行基准测试,人们会发现rep 方法更快。 @AnandaMahto 是的,我只是在考虑如何构建 OP 提到的确切调用,而不是你知道的,给出最有用的答案。 :)【参考方案3】:

我认为最简单(也是最短)的解决方案如下:

expand.grid(rep(list(1:3), 2)) 
  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

【讨论】:

以上是关于expand.grid 的动态参数的主要内容,如果未能解决你的问题,请参考以下文章

在 Julia 中从 R 中重现 `expand.grid` 函数

如何从 R 中的 expand.grid 生成满足特定条件的输出

粘贴网格 -- expand.grid 用于字符串连接

r expand.grid

请教关于Spring Data JPA动态查询参数的问题

菜鸟成长日记:Java基础篇2 --- 动态参数类型