[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