tintin_et_milou wrote:> > Hello, > > I have a vector of two columns like this: > m/Z I > 1000.235 125 > 1000.356 126.5 > .... > ... > > and a second vector with only one column: > m/Z > 995.547 > 1000.320 > ... > > For each value of the second vector I want to associate the value of the > intensity of the nearest m/Z associated. > I can do this with loops (Comparison value by value) but I think that > maybe a command exist... > > Thanks > >## construct sample data m1 matrix(c(1000.235,1000.356, 125,126.5),ncol=2, dimnames=list(NULL,c("mZ","I"))) y = c(995.547,1000.320) ## compute distances, set diagonal to infinity d = as.matrix(dist(cbind(m1[,1],y))) diag(d) <- Inf ## find minimum distances, extract values cbind(y,m1[apply(d,2,which.min),2]) Ben Bolker -- View this message in context: http://www.nabble.com/comparison-of-two-vectors-tf4936213.html#a14129523 Sent from the R help mailing list archive at Nabble.com.
Thanks for your help, but there is some more problem. The two vectors have
not the same length so there is a problem with cbind. I give you an example.
My first vector is
>g[g[,1]>2035 & g[,1]<2050,]
M.Z Intensity
2035.836 652.9494
2035.939 664.5841
2036.043 696.0554
2036.146 719.8969
2036.250 750.7660
2036.767 816.5243
2036.870 806.8539
2036.974 774.2397
2037.491 777.2780
2039.147 589.9075
2042.978 807.7167
2043.082 820.9365
2043.289 849.4942
2043.393 883.8975
2043.495 900.9681
2043.600 922.3238
2043.704 956.5985
2043.911 978.9377
2044.015 969.1999
and the second one is:> f[1:9,]
M.Z Intensity Echantillon Position
1802.809 1064.1210 1 A1
1865.615 8799.4880 1 A1
1896.426 1667.5908 1 A1
2001.064 515.6214 1 A1
2012.016 837.5599 1 A1
2021.589 4373.6364 1 A1
2028.425 832.6896 1 A1
2036.663 0.0000 1 A1
2043.497 0.0000 1 A1
The two vectors have not the same number of observations and in fact i would
like to replace all the intensity of zero of the second vector by the value
of the intensity of the nearest m/Z of the first vector.
In this case, the value 816.5243 for the m/Z 2036.663 of the second vector
and 900.9681 for the intensity corresponding at m/Z=2043.497.
Your method give me the intensity of the farest m/Z.
Thanks you again.
Lo?c
Ben Bolker wrote:>
>
>
> ## construct sample data
> m1 > matrix(c(1000.235,1000.356,
> 125,126.5),ncol=2,
> dimnames=list(NULL,c("mZ","I")))
>
> y = c(995.547,1000.320)
>
> ## compute distances, set diagonal to infinity
> d = as.matrix(dist(cbind(m1[,1],y)))
> diag(d) <- Inf
>
> ## find minimum distances, extract values
> cbind(y,m1[apply(d,2,which.min),2])
>
> Ben Bolker
>
>
--
View this message in context:
http://www.nabble.com/comparison-of-two-vectors-tf4936213.html#a14130713
Sent from the R help mailing list archive at Nabble.com.
Daniel Stepputtis wrote:> > Dear Ben, > I was searching for the same problem. Thank you very much, it helped me a > lot and I will use it quite often! > > In addition to the problem given by tintin_et_milou. I have to compare a > two pairs of vectors. > > I.e. I have two datasets each with latitude and longitude (which defines > the geographical position of data points.) > As you might imagine, it is meaningful to take into account both latitude > and longitude, when searching for the nearest data point from the otehr > dataset. > > Do you have any idea how to do this efficiently (actually I used loops ;-( > ? > Best regards > Daniel > > > Ben Bolker schrieb: >> >> distfun <- function(x1,x2) { (x1-x2)^2 } >> >> outer(m1[,1],y,distfun) > >> cheers >> Ben >Maybe (untested) distfun <- function(i,j) { (x1[i]-x2[j])^2 + (y1[i]-y2[j])^2) } outer(i,j,distfun) ? -- View this message in context: http://www.nabble.com/comparison-of-two-vectors-tf4936213.html#a14158136 Sent from the R help mailing list archive at Nabble.com.