I'm trying to do the following:

 

For each ordered pair of a data frame (D1) containing longitudes and
latitudes and unique point IDs, calculate the distance to every point in
another data frame (D2) also containing longitudes, latitudes and point
IDs, and return to a new variable in D1 the point ID of the nearest
element of D2.

 

Dramatis personae (mostly self-explanatory):

D1$long

D1$lat

D1$point.id

neighbor.id (to be created; for each ordered pair in D1 the point ID of
the nearest ordered pair in D2)

D2$long

D2$lat

D2$point.id

dist.geo (to be created)

 

I've been attempting this with nested for() loops that step through each
ordered pair in D1, and for each ordered pair [i] in D1 create a vector
(dist.geo) the length of D2$lat (say) that contains the distance
calculated from every ordered pair in D2 to the current ordered pair [i]
of D1, assign a value for D1$neighbor.id[i] based on
D2$point.id[(which.min(dist.geo)], and move on to the next ordered pair
of D1 to create another dist.geo, assign another neighbor.id, etc.

 

There are no missings/NAs in any of the longs, lats or point.ids,
although advice on generalizing this to deal with them would be
appreciated.

 

What I've been trying:

 

neighbor.id <- vector(length=length(D1$lat))
dist.geo <- vector(length=length(D2$lat))
for(i in 1:length(neighbor.id)){
for(j in 1:length(dist.geo)){
dist.geo[j] <- D1$lat[i]-D2$lat[j]}  

# Yes, I know that isn't the right formula, this is just a test

neighbor.id[i] <- D2$point.id[which.min(dist.geo)]}

 

What I get is a neighbor.id of the appropriate length, but which
consists only of the same value repeated.  Should I instead pass the
which.min(dist.geo) to a variable before exiting the inner (j) loop, and
reference that variable in place of which.min(dist.geo) in the last
line?  Or is this whole approach wrongheaded?

 

This should be elementary, I know, so I appreciate everyone's
forbearance.

 

Steven Sullivan, Ph.D.

Senior Associate

The QED Group, LLC

1250 Eye St. NW, Suite 802

Washington, DC  20005

ssullivan@qedgroupllc.com

202.898.1910.x15 (v)

202.898.0887 (f)

202.421.8161 (m)

 


	[[alternative HTML version deleted]]


