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))
就足够了。我猜想只对我们答案中的rep
与replicate
部分进行基准测试,人们会发现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` 函数