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
______________________________________________
[email protected] 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.