2016-04-12 19 views
-1

Ich mag den Manhattan-Abstand berechnen in r unter Verwendung Loopingberechnen Zeilendifferenz durch Looping

Bill = c(2,3.5,2,3.5,3) 
Ang = c(3.5,2,5,1.5,2) 

user = cbind(Bill, Ang) 

for (row in 1:nrow(user)){ 
    for (col in 1:ncol(user)){ 

    distance = 0 
    distance[row] = sum(abs(user[row,col] - user[row, col]))) 
    } 
} 

ich den Code zu verstehen, die folgenden zu tun: für die erste Schleife:

for row equal to 1 
    for col equal to 1 
    distance = absolute sum of user[1,1] - user[1,2] 

    Output 
    #distance [1] NA NA NA NA 0 

I wissen über die Anwendung und andere Methoden in den folgenden link

Vielen Dank für Ihre Hilfe.

+4

Was genau ist Ihre Frage? Warum brauchst du eine Schleife? Was ist deine gewünschte Ausgabe? – Heroka

+0

Die Frage ist, wie man die Manhattan-Entfernung durch Schleifen berechnet. Das ist der Unterschied zwischen den Zeilen und summiert sie. Bitte lesen Sie den Titel für weitere Informationen. –

+1

Bitte beachten Sie, lesen Sie auf [fragen] und auf [wie man ein reproduzierbares Beispiel in R erstellen] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Heroka

Antwort

1

Nicht sicher genau das, was Sie suchen, noch weiß ich, was Manhattan-Distanz ist, aber dies kann Ihre Frage beantworten:

Bill <- c(2,3.5,2,3.5,3) 
Ang <- c(3.5,2,5,1.5,2) 
Bob <- c(4,2,5.5,1.5,3) 
Dan <- c(3,2,8,2.5,6.5) 

user <- as.data.frame(cbind(Bill, Ang, Bob, Dan)) 


### Using numeric column references ### 

for (j in 2:ncol(user)) { 

    tmp  <- c(1:nrow(user)) 

    for (i in 1:nrow(user)) { 

     tmp[i] <- abs(user[i,1] - user[i,j]) 

    } 

    name <- paste0("dist_", names(user)[j]) 
    user <- cbind(user, tmp) 
    names(user)[names(user)=="tmp"] <- name 

} 
+0

Große Antwort. Vielen Dank!!!. Hier haben Sie bereits Spalten als "Bill" und "Ang" identifiziert. Gibt es einen automatischen Ansatz in der for-Schleife, wo Sie die Spaltennummer als Option verwenden könnten. –

+0

Kein Problem. Ich habe die Antwort so bearbeitet, dass sie numerische Spaltenverweise enthält. –

+0

Danke nochmal, was ich meinte war was wenn ich 1000 Spalten habe und ich möchte den Unterschied zwischen den Zeilen der Spalte 1 mit allen anderen Spalten berechnen. Sollte es ein Argument wie j in i: ncol (user) sein, benutze das um den Unterschied zu berechnen. Gibt es keinen automatischen Ansatz dafür? Danke –