Ähnliche Fragen wurden zum Zählen von Paaren gestellt, jedoch scheint keine für das, was ich zu tun versuche, besonders nützlich zu sein.
Ich möchte die Anzahl der Paare über mehrere Listenelemente hinweg zählen und in eine Matrix umwandeln. Wenn ich zum Beispiel eine Liste wie diese habe:
myList <- list(
a = c(2,4,6),
b = c(1,2,3,4),
c = c(1,2,5,7),
d = c(1,2,4,5,8)
)
Wir können sehen, dass das Paar 1:2
dreimal vorkommt (jeweils einmal in a
, b
, und c
). Das Paar 1:3
erscheint nur einmal in b
. Das Paar 1:4
erscheint 2 mal (je einmal in b
und d
)... usw.
Ich möchte zählen, wie oft ein Paar auftaucht und es dann in eine symmetrische Matrix umwandeln. Zum Beispiel würde meine gewünschte Ausgabe in etwa wie die von mir manuell erstellte Matrix aussehen (wobei jedes Element der Matrix die Gesamtzahl für dieses Wertepaar ist):
> myMatrix
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 0 3 1 2 2 0 1 1
[2,] 3 0 1 3 2 1 1 1
[3,] 1 1 0 1 0 0 0 0
[4,] 2 3 1 0 0 0 0 1
[5,] 2 2 0 0 0 0 1 1
[6,] 0 1 0 0 0 0 0 0
[7,] 1 1 0 0 1 0 0 0
[8,] 1 1 0 1 1 0 0 0
Alle Vorschläge sind sehr willkommen
Wir könnten eine Schleife über die list
, bekommen Sie die paarweise Kombinationen mit combn
, um stack
es zu einem zweispaltigen Datensatz konvertieren die Spalte ‚Werte‘ zu factor
mit levels
angegeben als 1 bis 8, erhalten die Frequenzzählung ( table
), tut ein Kreuzprodukt ( crossprod
), wandeln den Ausgang zurück zu logisch, und dann Reduce
die list
Elemente durch elementweises Hinzufügen und schließlich die diag
onalen Elemente auf 0 zuweisen . (Setzen Sie bei Bedarf die names
Attribute von dimnames
auf NULL
out <- Reduce(`+`, lapply(myList, function(x)
crossprod(table(transform(stack(setNames(
combn(x,
2, simplify = FALSE), combn(x, 2, paste, collapse="_"))),
values = factor(values, levels = 1:8))[2:1]))> 0))
diag(out) <- 0
names(dimnames(out)) <- NULL
-Ausgang
> out
1 2 3 4 5 6 7 8
1 0 3 1 2 2 0 1 1
2 3 0 1 3 2 1 1 1
3 1 1 0 1 0 0 0 0
4 2 3 1 0 1 1 0 1
5 2 2 0 1 0 0 1 1
6 0 1 0 1 0 0 0 0
7 1 1 0 0 1 0 0 0
8 1 1 0 1 1 0 0 0
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen