Seite 1 von 1

Neue Spalte mit Ergebnis einer Berechnung erzeugen

Verfasst: Fr Dez 06, 2019 4:30 pm
von jimjay203
Hallo zusammen,

ich bin noch recht neu in der Welt von R und hab eine Frage an der ich mir aktuell die Zähne ausbeiße...

Ich habe zwei Tabellen mit Adressen, Geo-Daten (Breiten- und Längengrad) und weiteren Informationen. Jetzt würde ich gerne die Geo-Daten aus jeder Zeile in Tabelle1 mit jeder Zeile in Tabelle 2 vergleichen und das Ergebnis (die Anzahl aller Adressen, die im Umkreis X Metern liegen) in eine neue Spalte in Tabelle1 schreiben. Die Funktionen für die Berechnung der Distanz sehen wie folgt aus:

Code: Alles auswählen

degreesToRadians <- function(deg){
  rad = deg * pi / 180
  
  return(rad)
}

locationDistance <- function(lat1, lon1, lat2, lon2){
  lat1 <- degreesToRadians(lat1)
  lon1 <- degreesToRadians(lon1)
  lat2 <- degreesToRadians(lat2)
  lon2 <- degreesToRadians(lon2)
  equRad <- 6378137
  
  distance = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon2-lon1))*equRad
  
  return(distance)
}
Wenn ich jetzt die Funktion aufrufe, lat1 und lat2 manuell mit Geo-Daten aus Tabelle1 fülle und mit den Geo-Daten aus Tabelle2 vergleiche, bekomme ich richtige Ergebnisse:

Code: Alles auswählen

> sum(locationDistance(53.57522, 8.58286, tabelle2$lat, tabelle2$lon) <= 25)
[1] 1
> sum(locationDistance(53.57522, 8.58286, tabelle2$lat, tabelle2$lon) <= 250)
[1] 181
> 
Was ich nicht hinbekomme ist es, diese Berechnung auf alle Zeilen in Tabelle1 anzuwenden und das Ergebnis in eine neue Spalte zu schreiben. Kann mir jemand von euch helfen?

LG
Jimmy

Re: Neue Spalte mit Ergebnis einer Berechnung erzeugen

Verfasst: Fr Dez 06, 2019 4:54 pm
von Athomas
So, wie Du es beschrieben hast, musst Du das "kartesische Produkt" der beiden Dateien bilden (etwa mit "merge") und die Entfernung der Kombinationen voneinander ausrechnen!?

Das können natürlich schnell recht viele werden!

Re: Neue Spalte mit Ergebnis einer Berechnung erzeugen

Verfasst: Fr Dez 06, 2019 11:51 pm
von EDi
diese Berechnung auf alle Zeilen in Tabelle1 anzuwenden
Pseudo-code (da reprodzierbares Beispiel fehlt):

Code: Alles auswählen

for (row in seq_len(nrow(tabelle1))) {
locationDistance(tabelle1$lat[row], tabelle1$lon[row], tabelle2$lat, tabelle2$lon) 
}
oder funktionell geschrieben:

Code: Alles auswählen

sapply(seq_len(nrow(tabelle1)), function(row) locationDistance(tabelle1$lat[row], tabelle1$lon[row], tabelle2$lat, tabelle2$lon) )

Re: Neue Spalte mit Ergebnis einer Berechnung erzeugen

Verfasst: Sa Dez 07, 2019 11:58 am
von jimjay203
EDi hat geschrieben: Fr Dez 06, 2019 11:51 pm oder funktionell geschrieben:

Code: Alles auswählen

sapply(seq_len(nrow(tabelle1)), function(row) locationDistance(tabelle1$lat[row], tabelle1$lon[row], tabelle2$lat, tabelle2$lon) )
Vielen Dank EDi! Damit läufts jetzt. Ich werde in der Zukunft versuchen daran zu denken ein reproduzierbares Beispiel zu geben.

Schönes WE