[R] Lining up x-y datasets based on values of x
    Marc Schwartz 
    marc_schwartz at comcast.net
       
    Thu Feb  1 21:28:56 CET 2007
    
    
  
On Thu, 2007-02-01 at 15:05 -0500, Christos Hatzis 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.
How about this:
x <- cbind(1:10, runif(10))
y <- cbind(5:14, runif(10))
z <- cbind((-4):5, runif(10))
colnames(x) <- c("X", "Y")
colnames(y) <- c("X", "Y")
colnames(z) <- c("X", "Y")
xy <- merge(x, y, by = "X", all = TRUE)
xyz <- merge(xy, z, by = "X", all = TRUE)
xyz[is.na(xyz)] <- 0
> xyz
    X       Y.x       Y.y         Y
1  -4 0.0000000 0.0000000 0.3969099
2  -3 0.0000000 0.0000000 0.8943127
3  -2 0.0000000 0.0000000 0.4882819
4  -1 0.0000000 0.0000000 0.0275787
5   0 0.0000000 0.0000000 0.7562341
6   1 0.6873130 0.0000000 0.6185218
7   2 0.1930880 0.0000000 0.2318025
8   3 0.1164783 0.0000000 0.7336057
9   4 0.7408532 0.0000000 0.3006347
10  5 0.7112887 0.6383823 0.8515126
11  6 0.2719079 0.5952721 0.0000000
12  7 0.2067017 0.8178048 0.0000000
13  8 0.2085043 0.5714917 0.0000000
14  9 0.2251435 0.4032660 0.0000000
15 10 0.3471888 0.5247478 0.0000000
16 11 0.0000000 0.6899197 0.0000000
17 12 0.0000000 0.7188912 0.0000000
18 13 0.0000000 0.9133252 0.0000000
19 14 0.0000000 0.9186001 0.0000000
Note that 'xyz' will be a data frame, so just use as.matrix(xyz) to
coerce back to a numeric matrix if needed.
See ?merge
HTH,
Marc Schwartz
    
    
More information about the R-help
mailing list