[R] Lining up x-y datasets based on values of x

Christos Hatzis christos at nuverabio.com
Fri Feb 2 05:01:38 CET 2007


Thanks Gabor.

This is along the lines of what I was looking for.  In fact the merge
function for zoo objects (ordered) turns out to be almost an order of
magnitude faster than the generic merge function for my problem:

> system.time(
+ zz <- merge( spec.1 = zoo(nmr.spectra.serum[[1]]$V2,
nmr.spectra.serum[[1]]$V1),
+        spec.2 = zoo(nmr.spectra.serum[[2]]$V2, nmr.spectra.serum[[2]]$V1),
fill=NA )
+ )
[1] 0.74 0.07 0.82   NA   NA
> system.time(
+ ww <- merge(nmr.spectra.serum[[1]], nmr.spectra.serum[[2]], by="V1",
all=T, sort=T)
+ )
[1] 6.85 0.05 6.94   NA   NA
> head(zz)
        spec.1 spec.2
-1322.2 -0.651     NA
-1321.9 -0.266     NA
-1321.7 -0.962     NA
-1321.4 -0.602     NA
-1321.2  0.753     NA
-1320.9  1.212     NA
> head(ww)
       V1   V2.x V2.y
1 -1322.2 -0.651   NA
2 -1321.9 -0.266   NA
3 -1321.7 -0.962   NA
4 -1321.4 -0.602   NA
5 -1321.2  0.753   NA
6 -1320.9  1.212   NA
> 

Thanks again.
-Christos 

-----Original Message-----
From: Gabor Grothendieck [mailto:ggrothendieck at gmail.com] 
Sent: Thursday, February 01, 2007 7:25 PM
To: christos at nuverabio.com
Cc: r-help at stat.math.ethz.ch
Subject: Re: [R] Lining up x-y datasets based on values of x

The zoo package has a multiway merge with optional zero fill.
Here are two ways:

library(zoo)
merge(x = zoo(x[,2], x[,1]),
      y = zoo(y[,2], y[,1]),
      z = zoo(z[,2], z[,1]),
      fill = 0)

# or

library(zoo)
X <- list(x = x, y = y, z = z)
merge0 <- function(..., fill = 0) merge(..., fill = fill) do.call("merge0",
lapply(X, function(x) zoo(x[,2], x[,1])))

To get more info on zoo try:

vignette("zoo")

On 2/1/07, Christos Hatzis <christos at nuverabio.com> wrote:
> Hi,
>
> I was wondering if there is a direct approach for lining up 2-column 
> matrices according to the values of the first column.  An example and 
> a brute-force approach is given below:
>
> x <- cbind(1:10, runif(10))
> y <- cbind(5:14, runif(10))
> z <- cbind((-4):5, runif(10))
>
> xx <- seq( min(c(x[,1],y[,1],z[,1])), max(c(x[,1],y[,1],z[,1])), 1) w 
> <- cbind(xx, matrix(rep(0, 3*length(xx)), ncol=3))
>
> w[ xx >= x[1,1] & xx <= x[10,1], 2 ] <- x[,2] w[ xx >= y[1,1] & xx <= 
> y[10,1], 3 ] <- y[,2] w[ xx >= z[1,1] & xx <= z[10,1], 4 ] <- z[,2]
>
> w
>
> I appreciate any pointers.
>
> Thanks.
>
> Christos Hatzis, Ph.D.
> Nuvera Biosciences, Inc.
> 400 West Cummings Park
> Suite 5350
> Woburn, MA 01801
> Tel: 781-938-3830
> www.nuverabio.com
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
>



More information about the R-help mailing list