Douglas M. Hultstrand
2010-Jan-05 00:37 UTC
[R] R matching lat/lon pairs from two datasets?
Hello, I am trying to match lat/lon from one dataset with the lat/lon from a second dataset and use that rows data for calculations. I am using match, but this is finding the first match and not comparing the pair, how can I determine if the lat/lon are the same? See example below. Is there a better way to determine to a matching pair of lat/lon values? Example Datasets: > data2 V1 V2 V3 1 -123.76 47.82 8 2 -123.75 47.82 11 > data[1:2] V1 V2 1 47.82 -123.76 2 47.82 -123.75 3 47.82 -123.74 4 47.82 -123.73 #Subset of current R code : lat <- data$V1 lon <- data$V2 yrs <- c(1,2,5,10,25,50,100,200,500,1000) lon2 <- data2$V1 lat2 <- data2$V2 ppt2 <- data2$V3 for(i in 1:length(lat2)) { loc <- match(lat2[i],lat) loc2 <- match(lon2[i], lon) print(loc); print(loc2) #Need to test to make sure loc equals loc2 freq_ppt <- c(data[i,4],data[i,6],data[i,8],data[i,10],data[i,12],data[i,14],data[i,16],data[i,18],data[i,20],data[i,22]) print(freq_ppt) return_value <- approx(freq_ppt,yrs,xout=data2[i,3]) print(return_value) } Thanks for your help, Doug -- --------------------------------- Douglas M. Hultstrand, MS Senior Hydrometeorologist Metstat, Inc. Windsor, Colorado voice: 970.686.1253 email: dmhultst at metstat.com web: http://www.metstat.com
I guess you want the subset of "data" whose lat/long pairs are present in "data2"? Try renaming your columns so that V1 and V2 are the same in both data frames (either lat,long, or long,lat, but not one way in one dataframe and the other way in the other one. Then use merge() -Don At 5:37 PM -0700 1/4/10, Douglas M. Hultstrand wrote:>Hello, > >I am trying to match lat/lon from one dataset with the lat/lon from >a second dataset and use that rows data for calculations. I am >using match, but this is finding the first match and not comparing >the pair, how can I determine if the lat/lon are the same? See >example below. Is there a better way to determine to a matching >pair of lat/lon values? > >Example Datasets: >> data2 > V1 V2 V3 >1 -123.76 47.82 8 >2 -123.75 47.82 11 > >> data[1:2] > V1 V2 >1 47.82 -123.76 >2 47.82 -123.75 >3 47.82 -123.74 >4 47.82 -123.73 > >#Subset of current R code : >lat <- data$V1 >lon <- data$V2 >yrs <- c(1,2,5,10,25,50,100,200,500,1000) >lon2 <- data2$V1 >lat2 <- data2$V2 >ppt2 <- data2$V3 > >for(i in 1:length(lat2)) { > loc <- match(lat2[i],lat) > loc2 <- match(lon2[i], lon) > print(loc); print(loc2) > > #Need to test to make sure loc equals loc2 > freq_ppt <- >c(data[i,4],data[i,6],data[i,8],data[i,10],data[i,12],data[i,14],data[i,16],data[i,18],data[i,20],data[i,22]) > print(freq_ppt) > return_value <- approx(freq_ppt,yrs,xout=data2[i,3]) > print(return_value) >} > > >Thanks for your help, >Doug > >-- >--------------------------------- >Douglas M. Hultstrand, MS >Senior Hydrometeorologist >Metstat, Inc. Windsor, Colorado >voice: 970.686.1253 >email: dmhultst at metstat.com >web: http://*www.*metstat.com > >______________________________________________ >R-help at r-project.org mailing list >https://*stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide http://*www.*R-project.org/posting-guide.html >and provide commented, minimal, self-contained, reproducible code.-- -------------------------------------- Don MacQueen Environmental Protection Department Lawrence Livermore National Laboratory Livermore, CA, USA 925-423-1062
couple of approaches:> merge(data1, data2, by.x=c("V1", "V2"), by.y=c("V2", "V1"))V1 V2 V3 1 47.82 -123.75 11 2 47.82 -123.76 8> library(sqldf) > sqldf("select * from data2 x2, data1 x1 where x2.V1=x1.V2 andx2.V2=x1.V1") V1 V2 V3 V1 V2 1 -123.76 47.82 8 -123.76 47.82 2 -123.75 47.82 11 -123.75 47.82>On Mon, Jan 4, 2010 at 7:37 PM, Douglas M. Hultstrand <dmhultst@metstat.com>wrote:> Hello, > > I am trying to match lat/lon from one dataset with the lat/lon from a > second dataset and use that rows data for calculations. I am using match, > but this is finding the first match and not comparing the pair, how can I > determine if the lat/lon are the same? See example below. Is there a > better way to determine to a matching pair of lat/lon values? > > Example Datasets: > > data2 > V1 V2 V3 > 1 -123.76 47.82 8 > 2 -123.75 47.82 11 > > > data[1:2] > V1 V2 > 1 47.82 -123.76 > 2 47.82 -123.75 > 3 47.82 -123.74 > 4 47.82 -123.73 > > #Subset of current R code : > lat <- data$V1 > lon <- data$V2 > yrs <- c(1,2,5,10,25,50,100,200,500,1000) > lon2 <- data2$V1 > lat2 <- data2$V2 > ppt2 <- data2$V3 > > for(i in 1:length(lat2)) { > loc <- match(lat2[i],lat) > loc2 <- match(lon2[i], lon) > print(loc); print(loc2) > > #Need to test to make sure loc equals loc2 > freq_ppt <- > c(data[i,4],data[i,6],data[i,8],data[i,10],data[i,12],data[i,14],data[i,16],data[i,18],data[i,20],data[i,22]) > print(freq_ppt) > return_value <- approx(freq_ppt,yrs,xout=data2[i,3]) > print(return_value) > } > > > Thanks for your help, > Doug > > -- > --------------------------------- > Douglas M. Hultstrand, MS > Senior Hydrometeorologist > Metstat, Inc. Windsor, Colorado > voice: 970.686.1253 > email: dmhultst@metstat.com > web: http://www.metstat.com > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html<http://www.r-project.org/posting-guide.html> > and provide commented, minimal, self-contained, reproducible code. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem that you are trying to solve? [[alternative HTML version deleted]]
Or if there is a requirement for speed or shorter more convenient syntax then there is a data.table join. Basically setkey(data1,V1,V2) and setkey(data2,V1,V2), then "data1[data2]" does the merge very quickly. You probably then want to do something with the merged data set, which you just add in like this "data1[data2,<something>]" or like this "data1[data2][,<something>]". The columns in the key need to be either integers, or factors (which are internally integer), so it would be a bit of extra work in this case to store the lat/lon as integer, if multiplying by 100 is ok. Another option for you anyway. "jim holtman" <jholtman at gmail.com> wrote in message news:644e1f321001041828n2f2a160etd597ba7a8bf76ad6 at mail.gmail.com...> couple of approaches: > >> merge(data1, data2, by.x=c("V1", "V2"), by.y=c("V2", "V1")) > V1 V2 V3 > 1 47.82 -123.75 11 > 2 47.82 -123.76 8 >> library(sqldf) >> sqldf("select * from data2 x2, data1 x1 where x2.V1=x1.V2 and > x2.V2=x1.V1") > V1 V2 V3 V1 V2 > 1 -123.76 47.82 8 -123.76 47.82 > 2 -123.75 47.82 11 -123.75 47.82 >> > > > On Mon, Jan 4, 2010 at 7:37 PM, Douglas M. Hultstrand > <dmhultst at metstat.com>wrote: > >> Hello, >> >> I am trying to match lat/lon from one dataset with the lat/lon from a >> second dataset and use that rows data for calculations. I am using >> match, >> but this is finding the first match and not comparing the pair, how can I >> determine if the lat/lon are the same? See example below. Is there a >> better way to determine to a matching pair of lat/lon values? >> >> Example Datasets: >> > data2 >> V1 V2 V3 >> 1 -123.76 47.82 8 >> 2 -123.75 47.82 11 >> >> > data[1:2] >> V1 V2 >> 1 47.82 -123.76 >> 2 47.82 -123.75 >> 3 47.82 -123.74 >> 4 47.82 -123.73 >> >> #Subset of current R code : >> lat <- data$V1 >> lon <- data$V2 >> yrs <- c(1,2,5,10,25,50,100,200,500,1000) >> lon2 <- data2$V1 >> lat2 <- data2$V2 >> ppt2 <- data2$V3 >> >> for(i in 1:length(lat2)) { >> loc <- match(lat2[i],lat) >> loc2 <- match(lon2[i], lon) >> print(loc); print(loc2) >> >> #Need to test to make sure loc equals loc2 >> freq_ppt <- >> c(data[i,4],data[i,6],data[i,8],data[i,10],data[i,12],data[i,14],data[i,16],data[i,18],data[i,20],data[i,22]) >> print(freq_ppt) >> return_value <- approx(freq_ppt,yrs,xout=data2[i,3]) >> print(return_value) >> } >> >> >> Thanks for your help, >> Doug >> >> -- >> --------------------------------- >> Douglas M. Hultstrand, MS >> Senior Hydrometeorologist >> Metstat, Inc. Windsor, Colorado >> voice: 970.686.1253 >> email: dmhultst at metstat.com >> web: http://www.metstat.com >> >> ______________________________________________ >> R-help at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide >> http://www.R-project.org/posting-guide.html<http://www.r-project.org/posting-guide.html> >> and provide commented, minimal, self-contained, reproducible code. >> > > > > -- > Jim Holtman > Cincinnati, OH > +1 513 646 9390 > > What is the problem that you are trying to solve? > > [[alternative HTML version deleted]] >