Ich versuche, eine große Matrix (55920484 Elemente) in R zu füllen, die schließlich symmetrisch sein wird (also führe ich nur Berechnungen für die Hälfte der Matrix durch). Die resultierende Wertematrix ist eine quadratische Matrix, die die gleichen Zeilen- und Spaltennamen hat. Jeder Wert in der Matrix ist das Ergebnis des Vergleichens eindeutiger Listen und des Zählens der Anzahl von Kreuzungen. Diese Daten stammen von einem größeren Datenrahmen (427,5 MB). Hier ist meine schnellste Lösung so weit, ich versuche, der Schleifen, um loszuwerden, die ich kenne, sind langsam:Optimierungsgeschwindigkeit für das Auffüllen einer Matrix
for(i in 1:length(rownames(values))){
for(j in i:length(colnames(values))){
A = data[data$Stock==rownames(values)[i],"Fund"]
B = data[data$Stock==colnames(values)[j],"Fund"]
values[i, j] = length(intersect(A, B))
}
}
ich einige andere Ansätze wie mit Hilfe einer Datenbank mit einer SQL-Verbindung versucht haben, eine spärliche Matrix mit 0 und 1, und mit Hilfe des sqldf Pakets in R.
Hier ist die Struktur meiner Daten:
head(data)
Fund Stock Type Shares.Held Maket.Value X..of.Portfolio Rank Change.in.Shares X..Change X..Ownership
1 12 WEST CAPITAL MANAGEMENT LP GRUB CALL 500000 12100000 0.0173 12 500000 New N/A
2 12 WEST CAPITAL MANAGEMENT LP FIVE SH 214521 6886000 0.0099 15 214521 New 0
3 12 WEST CAPITAL MANAGEMENT LP SHAK SH 314114 12439000 0.0178 11 307114 4387 1
4 12 WEST CAPITAL MANAGEMENT LP FRSH SH 324120 3650000 0.0053 16 -175880 -35 2
5 12 WEST CAPITAL MANAGEMENT LP ATRA SH 393700 10398000 0.0149 14 162003 69 1
6 12 WEST CAPITAL MANAGEMENT LP ALNY SH 651000 61285000 0.0875 4 No Change 0 1
klingt wie etwas data.table ziemlich gut tun könnte. Vielleicht posten Sie den "Kopf" Ihrer "Werte" und "Daten" -Objekte, geben Sie also mehr Informationen über die Struktur Ihrer Daten. Prost – shekeine