2013-10-16 18 views
5

Sto usando expand.grid per generare tutte le coppie degli elementi di un vettore, come ad esempio:argomenti dinamici per expand.grid

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

che dà:

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 

Ora, dicono che vogliono la stessa cosa ma con triplette io uso

expand.grid(v,v,v) 

Come potrei fare per generalizzare questo per n-tuple in modo che io può usare new.expand.grid(v,5) e avere il risultato di expand.grid(v,v,v,v,v)?

risposta

9

expand.grid può prendere come input un list, quindi che dire di replicate?

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

Per divertimento, come una funzione (anche se so che si dovrebbe sapere come fare):

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

Grande! Non pensavo davvero di farlo in questo modo! – nico

5

do.call è il modo standard di passare un insieme dinamico di argomenti a una funzione:

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

Esempio: 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

Punto preso su 'do.call', ma penso che sia eccessivo in questo caso. 'expand.grid (rep (list (v), 4))' sarebbe sufficiente. Direi che benchmarking solo la parte 'rep' vs' replicate' delle nostre risposte, si potrebbe trovare l'approccio 'rep' per essere più veloce. – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto Sì, stavo solo pensando a come costruire la chiamata esatta menzionata dall'OP, invece di, sai, dare la risposta più utile. :) – Frank