2010-05-06 7 views
10

Ich implementiere einen Algorithmus, der das Hinzufügen und Entfernen von Dingen aus Mengen beinhaltet. In R ist dies langsam, da, soweit ich weiß, das Hinzufügen oder Entfernen von Dingen aus einem Vektor langsam ist, da der gesamte Vektor neu zugeordnet werden muss. Gibt es einen Weg, es effizienter zu machen?Effizientes Hinzufügen oder Entfernen von Elementen zu einem Vektor oder einer Liste in R?

Edit: Meine aktuelle Lösung ist einen boolean Vektor der gleichen Länge wie die Liste der Dinge zu verwenden, die in der Menge sein können, und die Verwendung dieser als Mitglied Tabelle.

+1

Gibt es eine Chance, dass Sie genauen Code zur Verfügung stellen? Von dir Frage ich kann nicht herausfinden, wenn Sie Liste oder Vektoren verwenden, wie Sie hinzufügen oder entfernen (welche Funktion?) Elemente, wie funktioniert Ihre aktuelle Lösung (logischer Vektor neu erstellt stattdessen Hinzufügen/Entfernen zum Original?)? Weitere Informationen, die Sie bereitstellen, können optimiert werden. – Marek

+0

neue Version von R sollte besser sein. Ist das wahr? – userJT

+0

Ich bezweifle, dass die Größe eines Vektors wiederholt, wenn Elemente hinzugefügt oder entfernt werden, jemals schnell sein wird. –

Antwort

12

Kapitel 2 von The R Inferno hat einige interessante Kommentare zu diesem Thema, einschließlich periodische wachsenden Objekte wieder Duce Speicherfragmentierung und Allokationsaufwand.

Wenn Sie wissen, was die ultimative Größe des Satzes ist, dann ist die Methode, die Sie vorschlagen, wahrscheinlich die beste - dh subset aus dem gesamten Universum mit einem geeigneten Mitgliedschaftsvektor. Schwierig zu wissen, was am besten ist, ohne genau zu sehen, was Sie zu tun versuchen.

+0

+1 für die Referenzierung der R Inferno – Stedy

+0

Ich endete mit einem booleschen Vektor, der Satzzugehörigkeit darstellt. –

+0

könnten Sie den Link aktualisieren?'404 Not Found' – Shreyans

11

Wenn Sie können, Initialisieren eines Vektors, so dass er Länge gleich seiner maximalen Länge während des Algorithmus kann helfen hat.

z.B.

vec <- rep(NA,10) 
vec[1:3] <- 1:3 
vec[4:5] <- 4:5 
vec[6:10] <- 6:10 

statt

vec <- 1:3 
vec <- c(vec,4:5) 
vec <- c(vec,6:10) 

vergleichen

> system.time({vec <- rep(NA,10^4); for (i in 1:(10^4)) vec[i] <- i }) 
    user system elapsed 
    0.043 0.001 0.044 

zu

> system.time({vec <- NULL; for (i in 1:(10^4)) vec <- c(vec,i) }) 
    user system elapsed 
    0.249 0.089 0.335 
+0

Aber ich könnte möglicherweise jedes Element im Vektor entfernen, nicht nur das letzte. –

+1

Sicher. Die Schleifen sind nur Beispiele, um den Unterschied zwischen der Initialisierung eines Vektors und dem Aufbau eines Vektors mit wiederholter Zuweisung zu zeigen. Ich habe deinen Algorithmus offensichtlich nicht gesehen, aber diese Methode sollte trotzdem funktionieren, da "ich" an jedem Punkt in deinem Algorithmus eine beliebige Zahl sein kann. Es hängt nur davon ab, dass Sie die Länge Ihres Vektors kennen. Anstatt es zu entfernen, würden Sie auch dieses Element als 'NA' zuweisen und einen Vektor von gleicher Länge beibehalten. – wkmor1

+0

Sie brauchen 'eval/parse' nicht zu verwenden, es reicht, wenn Sie Ausdrücke in geschweiften Klammern verwenden, zB:' system.time ({vec <- rep (NA, 10^4); für (i in 1 :(10^4)) vec [i] <- i}) ' – Marek

3

Es ist schwer zu sagen, was Sie wollen. Vielleicht möchten Sie wirklich Befehle wie Push und Pop stapeln. Das Folgende ist nicht das. Aber es ist eine schnelle Lösung.

Vergeben Sie einen Vektor groß genug, um alle Ihre Artikel von der Art zu halten, die Sie benötigen. Setzen Sie jeden Wert auf NA. Das Hinzufügen von Elementen ist einfach. Durch das Entfernen von Elementen werden sie wieder auf NA gesetzt. Mit dem Vektor ist nur na.omit(myVec)

myVec <- numeric (maxLength) # a vector of maximum length 

is.na(myVec) <- 1:maxLength # set every item in myVec to NA 

myVec[c(2,6,20)] <- 5   # add some values 

na.omit(myVec) 

#This will also work if you can initialize all of your values to something that you know you won't need. 
+0

Ein R-Stack: http://rosettacode.org/wiki/Stack#R –

+1

@John: 'myVec <- rep (NA, maxLength)' ersetzt Ihre ersten zwei Zeilen sauberer. Was ist mit der großen Schrift? –

Verwandte Themen