2013-10-16 10 views
5

Używam expand.grid do generowania wszystkich par elementów wektora, takich jak:dynamiczne argumenty expand.grid

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

co daje:

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 

teraz powiedzieć, że chce to samo, ale z trojaczków używam

expand.grid(v,v,v) 

Jak bym go o uogólniając to n-krotek, abym można użyć new.expand.grid(v,5) i uzyskać wynik expand.grid(v,v,v,v,v)?

Odpowiedz

9

expand.grid może przyjąć list jako wejście, więc co z replicate?

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

Dla zabawy, jako funkcję (choć wiem, że wiesz, jak to zrobić):

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 
+0

Świetnie! Tak naprawdę nie myślałem o zrobieniu tego w ten sposób! – nico

5

do.call to standardowy sposób przekazywania dynamiczny zestaw argumentów do funkcja:

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

przykład: 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 
+1

Punkt zaczerpnięty z 'do.call', ale myślę, że jest to przesada w tym przypadku. 'expand.grid (rep (list (v), 4))' byłoby wystarczające. Przypuszczam, że benchmarking tylko części odpowiedzi "rep" a "replikuj", można by uznać, że podejście "rep" jest szybsze. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Tak, właśnie myślałem o tym, jak skonstruować dokładne połączenie, o którym wspomniał OP, zamiast, no wiesz, podając najbardziej użyteczną odpowiedź. :) – Frank