[R] nested for() loops for returning a nearest point
Roger Bivand
Roger.Bivand at nhh.no
Wed Jul 30 18:47:45 CEST 2003
On Wed, 30 Jul 2003, Steve Sullivan wrote:
> 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.
I think you can get quite a long way with the function rdist.earth() in
the fields package:
> loc1 <- expand.grid(long=seq(-150,150,5), lat=seq(-70,70,5))
> dim(loc1)
[1] 1769 2
> loc2 <- expand.grid(long=seq(-150,150,7.5), lat=seq(-70,70,7.5))
> dim(loc2)
[1] 779 2
> dists <- rdist.earth(loc1, loc2)
> id12 <- apply(dists, 1, which.min)
> length(id12)
[1] 1769
> id21 <- apply(dists, 2, which.min)
> length(id21)
[1] 779
using id12 and id21 to choose the point.ids if need be
> loc2$point.id[id12]
Roger
>
> 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 at qedgroupllc.com
>
> 202.898.1910.x15 (v)
>
> 202.898.0887 (f)
>
> 202.421.8161 (m)
>
>
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help
>
--
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Breiviksveien 40, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 93 93
e-mail: Roger.Bivand at nhh.no
More information about the R-help
mailing list