2015-01-26 6 views

risposta

7

Si potrebbe utilizzare do.call e expand.grid:

do.call(expand.grid, lapply(x, function(y) c(y, -y))) 
# Var1 Var2 Var3 Var4 
# 1  1 2 3 4 
# 2 -1 2 3 4 
# 3  1 -2 3 4 
# 4 -1 -2 3 4 
# 5  1 2 -3 4 
# 6 -1 2 -3 4 
# 7  1 -2 -3 4 
# 8 -1 -2 -3 4 
# 9  1 2 3 -4 
# 10 -1 2 3 -4 
# 11 1 -2 3 -4 
# 12 -1 -2 3 -4 
# 13 1 2 -3 -4 
# 14 -1 2 -3 -4 
# 15 1 -2 -3 -4 
# 16 -1 -2 -3 -4 

Il codice lapply(1:4, function(x) c(x, -x)) crea un elenco di ogni elemento della vostra vettoriale e il suo negativo; nel tuo caso questo sarebbe list(c(1, -1), c(2, -2), c(3, -3), c(4, -4)). Quindi, do.call passa ognuno di questi elementi di elenco come argomenti a expand.grid, che restituisce tutte le combinazioni possibili.

Un modo leggermente più semplice per ottenere gli argomenti potrebbe essere quello di utilizzare as.data.frame(rbind(x, -x)) anziché lapply(x, function(y) c(y, -y)).

1

uso library(gtools)

gtools::combinations(8,4, c(-4:-1,1:4)) 
+1

Io non credo che questo è giusto. Ad esempio, uno degli output di questo è '-4 -1 1 4' mentre non penso che dovrebbero esserci duplicati coinvolti – Dason

+1

@Dason il tuo punto mi fa pensare che la domanda originale non sia chiara. "Tutte le combinazioni di un vettore e dei suoi negativi" per me significa ciò che ho inserito. –

+0

Sono d'accordo. Non è completamente chiaro cosa c'è nella parte ', ...,' dell'output desiderato nella domanda –

7

O una variante della soluzione @ di josilber è

expand.grid(Map(c, x, -x)) 
Problemi correlati