Java Mailing List Archive

http://www.r-help.com/

Home » Home (12/2007) » R Help for Statistical Computing »

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

Christos Hatzis

2007-02-01

Replies:

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@(protected)]
Sent: Thursday, February 01, 2007 7:25 PM
To: christos@(protected)
Cc: r-help@(protected)
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@(protected):
> 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@(protected)
> 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.
>

______________________________________________
R-help@(protected)
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.
©2008 r-help.com - Jax Systems, LLC, U.S.A.