[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