[R] finding the intersection of two vectors

Rolf Turner rolf.turner at xtra.co.nz
Thu Jul 7 11:13:17 CEST 2011

On 07/07/11 08:43, Data Analytics Corp. wrote:
> Hi,
> Suppose I have two vectors, not necessarily the same length (in fact, 
> they usually are different lengths): y.1 that has increasing values 
> between 0 and 1; y.2 that has decreasing values between 1.0 and 0.  
> You can picture these as being supply (= y.1) and demand (= y.2) 
> curves from economics.  I typically plot these vectors on the same 
> graph against a common x variable, which happens to be price for what 
> I do.  The price variable runs from, say, $0 to $25.  When I plot y.1 
> and y.2, I've been eye-balling a vertical line at a price point where 
> y.1 intersects y.2.  I'm now tired of eye-balling a line through the 
> intersection -- takes too much time to get it right or just close 
> enough.  I can't figure out how to find the price value at which the 
> two curves intersect.  Going back to the economics interpretation, I 
> want the price where supply equals demand.  Any suggestions as to how 
> I can find that price point in R?  Any functions that help?

There will actually be two pairs of points, one pair on the price curve 
and one
pair on the demand curve, so that the intersection of the two curves 
lies between
the respective pair on each curve.  Without an algebraic expression for 
the curves,
that's all you can say.  The following function joins the respective 
pairs of points
> findInt <- function (x1,y1,x2,y2,plot=FALSE) {
> #
> # x1 and y1 are the coordinates of the points on the INCREASING curve.
> # x2 and y2 are the coordinates of the points on the DECREASING curve.
> #
> y1star <- approx(x2,y2,xout=x1,yleft=Inf,yright=-Inf)$y
> k <- sum(y1 <= y1star)
> y2star <- approx(x1,y1,xout=x2,yleft=-Inf,yright=Inf)$y
> ell <- sum(y2 >= y2star)
> b1 <- y1[k]
> b2 <- y2[ell]
> m1 <- (y1[k+1] - y1[k])/(x1[k+1] - x1[k])
> m2 <- (y2[ell+1] - y2[ell])/(x2[ell+1] - x2[ell])
> x <- (b1-b2-m1*x1[k]+m2*x2[ell])/(m2-m1)
> y <- b1 + m1*(x-x1[k])
> if(plot) {
>         plot(x1,y1,xlim=range(x1,x2),ylim=range(y1,y2))
>         points(x2,y2,col="red")
>         segments(x1[k],y1[k],x1[k+1],y1[k+1])
>         segments(x2[ell],y2[ell],x2[ell+1],y2[ell+1])
>         points(x,y,pch=20)
> }
> c(x=x,y=y)
> }

by straight lines and finds the point of intersection of the two lines.  
This is probably
pretty similar to the point you'd get by eye-balling the data.


         Rolf Turner

More information about the R-help mailing list