2016-05-01 9 views
0

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 
+2

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

Antwort

1

ich sehe drei Probleme, um immer mehr an Bedeutung:

(1) Sie rufen rownames (Werte) und colnames (Werte) mehrmals auf, anstatt sie nur einmal außerhalb der Schleifen aufzurufen. Es kann oder kann nicht helfen.

(2) Sie berechnen A = data[data$Stock==rownames(values)[i],"Fund"] unter der innersten Schleife, während Sie es außerhalb dieser Schleife berechnen sollten.

(3) Am wichtigsten: Ihr Code verwendet nur zwei Spalten Ihrer Tabelle: Fund und Stock. Ich sehe, dass es in Ihren Daten viele Zeilen gibt, in denen Fonds und Aktie gleich sind. Sie sollten diese Redundanz beseitigen. Vielleicht möchten Sie data1=data[,c("Fund","Stock")] und eliminieren redundante Zeilen in data1 (ohne Schleife) erstellen:

data1 = data1[,order(data1[,"Fund"])] 
len = nrow(data1) 
good = c(TRUE,data1[-len,1]!=data1[-1,1]|data1[-len,2]!=data1[-1,2]) 
data1 = data1[good,] 

(ich nicht den Code oben getestet haben)

Vielleicht möchten Sie weiter gehen und die Liste zu erstellen, die, Gibt für jeden Fonds an, welche Bestände er enthält, und zwar ohne Entlassungen.

PS: Sie können immer noch die Liste erstellen, die für jede Aktie, gibt an, welche Mittel sie haben:

rv = rownames(values) 
len = length(rv) 
fund.list = list() 
for (i in 1:len) 
    fund.list[[,i]] = data[data$Stock==rv[i],"Fund"] 
for (i in 1:len) { 
    A = fund.list[[i]] 
    for (j in i:len) { 
     values[i, j] = length(intersect(A, fund.list[[j]])) 
    } 
} 
+0

Danke, einige davon sind leider hilfreich für # 3 gibt es nicht wirklich redundante Zeilen in meinen Daten zwischen nur Fonds und Aktien :( – klib

+0

In den Daten in Ihrer Frage dargestellt gibt es ein redundantes Paar (12, West) – user31264

+0

oh Entschuldigung, nein, es ist nicht ausgerichtet der Fonds ist "12 West Capital Management LP" und die Aktien sind GRUB, FIVE ... Ich werde in der Frage klären und sie ausrichten – klib

Verwandte Themen