Sagen, ich habe zwei VektorenKombinationen von Kombinationen in R
upVariables<-c("up1", "up2", "up3", "up4", "up5")
downVariables<-c("down1", "down2", "down3", "down4", "down5")
Jeder von ihnen wird eine Nummer in einer anderen Vektoren suchen verwendet werden. Ich suche nach allen möglichen Mengen von zwei Verhältnissen (alle möglichen Mengen von vier Variablen, zwei von jedem Vektor), wobei der Zähler immer aus upVariables ist, der Demominator immer aus downVariables und die letzte Menge nicht die gleiche Variable verwendet zweimal.
Ich habe so weit wie
upCombos<-combn(upVariables,2)
downCombos<-combn(downVariables,2)
combos<-arrange(expand.grid(upCombos=upCombos[,1],downCombos=downCombos[,1]),upCombos)
bekam ich nur hier die erste mögliche Kombination verwendet wird, zu veranschaulichen, aber ich würde wollen alle möglichen Kombinationen iterieren. Das gibt mir:
> combos
upCombos downCombos
1 up1 down1
2 up1 down2
3 up2 down1
4 up2 down2
Was möchte ich von diesem obwohl produzieren zwei Sätze, so etwas wie:
> combos[1]
upCombos downCombos
1 up1 down1
2 up2 down2
und
> combos[2]
upCombos downCombos
1 up1 down2
2 up2 down1
so dass in jedem Fall, die jeweils Der Wert von upCombos wird nur einmal verwendet und jeder Wert von downCombos wird nur einmal verwendet. Ist das sinnvoll? Irgendwelche Ideen wie man das macht?
Idealerweise würde ich dann gerne in der Lage sein, Sätze von 3 aus den Originalvektoren anstatt 2er-Sätze zu verallgemeinern, aber ich werde glücklich sein, Sätze von 2 Arbeiten für jetzt zu bekommen.
** Edit Also Jota hat eine Lösung zur Verfügung gestellt, die die Anordnungen innerhalb einer Gruppe von 4 Variablen (2 von upVariables, 2 von downVariables) zur Verfügung stellt. Ich sehe immer noch nicht, wie ich über alle möglichen Mengen von 4 Variablen iteriere. Das Nächste, was ich habe, ist, Jotas Vorschlag in zwei for-Schleifen zu setzen (sehe den noch-nicht-R-Programmierer). Dies liefert viel weniger Kombinationen, als es sein sollte.
n<-2
offset<-n-1
for (i in 1:(length(upVariable)-offset)){
for (j in 1:(length(downVariables)-offset)){
combos <- expand.grid(upVariables[i:(i+offset)], downVariables[j:(j+offset)])
combos <- combos[with(combos, order(Var1)), ] # use dplyr::arrange if you prefer
mat <- matrix(1:n^2, byrow = TRUE, nrow = n)
for(j in 2:nrow(mat)) mat[j, ] <- mat[j, c(j:ncol(mat), 1:(j - 1))]
pairs<-(split(combos[c(mat), ], rep(1:n, each = n)))
collapsed<-sapply(lapply(pairs, apply, 1, paste, collapse = '_'), paste, collapse = '-')
ratioGroups<-c(ratioGroups,collapsed)
}
}
Dies gibt nur 16 Variablensätze zurück (jeweils mit 2 Kombinationen, also insgesamt 32). Mit 5 Variablen in jedem Satz gibt es jedoch viel mehr Möglichkeiten.
Also das funktioniert, um alle Kombinationen für eine bestimmte Menge von Variablen zu erhalten. Wie ändere ich das so, dass es über alle möglichen Kombinationen von up1: up5 und down2: down5 iteriert? Mein erster Gedanke war, dass in diesem Fall zwei for-Schleifen, dh für (i in 1: (Länge (upVariables) -offset)) usw. Dies scheint a) nicht sehr R wie - ich bin sicher, es gibt einen besseren Weg, dies zu tun und b) es scheint nicht annähernd so viele Kombinationen hervorzubringen, wie ich dachte. – Ben
Ich bezog mich auf das Bit an der Spitze meiner Frage, wo ich erwähnte, dass ich zwei Sätze von Variablen hatte, upVariables und downVariables, und dass ich alle möglichen Kombinationen von 4 Variablen (2 von jedem) bekommen wollte. Ich benutzte den ersten Satz von vier, um zu zeigen, was ich mit jedem einzelnen Set machen wollte. Deine Antwort funktioniert hervorragend, um die Variablen mit jedem Satz von 4 zu arrangieren. Ich dachte, ich wäre in der Lage, sie zu erweitern, um über alle möglichen Mengen zu iterieren, aber es scheint nicht möglich zu sein. Ich werde zurückgehen und sehen, ob ich die Frage besser formulieren kann. – Ben
Ich ... kann etwas haben. Wird eine Antwort posten. – Ben