2013-02-08 18 views
5

Ich habe einen Datenrahmen mit drei Spalten: Ref, Ziel, Abstand. Jede Referenz hat eine gemessene Entfernung zu der gleichen Menge von Zielen und ich möchte einen Vektor von Mindestabständen für jede Referenz erhalten. Im Moment mache ich das mit einer for-Schleife, aber es scheint, als müsste es eine Möglichkeit geben, dies zu vektorisieren.Vectorize für Schleife über Datenrahmen in R

Hier ist mein Code:

refs <- levels(data$ref) 

result <- c() 
for (ref in refs) { 
    # Find the minimum distance for observations with the current ref 
    # but be sure to protect against ref == target! 
    best_dist <- min(data[data$ref == ref & data$target != ref,]$distance) 
    result <- c(result, best_dist) 
} 

Bin ich dazu verdammt, durch meinen Datenrahmen auf diese Weise eingerichtet haben oder ist es ein guter Weg, dies zu vektorisieren? Danke für die Hilfe!

Antwort

6

Niemals ein Objekt innerhalb einer Schleife mit c, cbind, rbind anbauen. Das Objekt wird jedes Mal kopiert. Stattdessen die korrekte Größe zuweisen (oder einige überschätzen, wenn das Ergebnis flüssig ist).

Dass gesagt wird, wird eine Schleife hier nicht

erforderlich

Ich mag data.table s für Speichereffizienz und die Kodierung der Eleganz.

library(data.table) 
DT <- data.table(data) 


DT[ref != target, list(bestdist = min(distance)), by = ref] 

wenn ref und Ziel sind Faktor Spalten mit verschiedenen Ebenen (wie im Kommentar vorgeschlagen), dann entweder sie identische Ebene machen, oder zum Charakter umwandeln

DT[as.character(ref) != as.character(target), list(bestdist = min(distance)), by = ref] 
+0

Ich glaube, Sie haben a ')' fehlt dort ... – adibender

+0

ta. Jetzt behoben .. – mnel

+0

Dies scheint nicht ganz so zu funktionieren, wie es ist. Ich bekomme den folgenden Fehler, wenn ich dies versuche: ** Fehler in Ops.factor (Ref, Ziel): Level-Sätze von Faktoren sind unterschiedlich ** Allerdings ** DT [, Liste (bestdist = min (Abstand)), durch = ref] ** Liefert Ausgabe, aber ohne ref! = Zielprüfung. – weitzner