[R] Data frame with 3 columns to matrix
Michael Bach
phaebz at gmail.com
Tue Apr 19 14:16:54 CEST 2011
David Winsemius <dwinsemius at comcast.net> writes:
> Perhaps but only if the third row of your example was incorrectly constructed:
>> dta <- rd.txt(" x y z
> 1 1.00 5 0.5
> 2 1.02 5 0.7
> 3 1.04 7 0.1
> 4 1.06 9 0.4")
> #rd.txt() is a combo fn of read.table and textConnection
>
>> mat <- matrix(NA, ncol=NROW(dta)+1, nrow=NROW(dta)+1)
>> mat[2:NROW(mat),1] <- dta[["x"]]
>> mat[1,2:NROW(mat)] <- dta[["y"]]
>> diag(mat) <- c(NA, dta[["z"]])
>> mat
> [,1] [,2] [,3] [,4] [,5]
> [1,] NA 5.0 5.0 7.0 9.0
> [2,] 1.00 0.5 NA NA NA
> [3,] 1.02 NA 0.7 NA NA
> [4,] 1.04 NA NA 0.1 NA
> [5,] 1.06 NA NA NA 0.4
>
>
Thanks for your answer David,
but this yields a diagonal matrix only. I think I did not make myself
clear enough. In the original 3 column data frame, there could have
been a pair of x and y with identical y's but different x's and z's.
The way my data source is derived, there is a guarantee that there is
are no two rows with identical x and y in the original data frame. In
the end, x and y serve as a grid, with z values at each point in the
grid or NA's if there is no z value for a x and y pair. The number of
rows in the data frame is then equal to the number of non-NA values in
the resulting matrix.
Another try, lets assume this original data frame:
x y z
1 2 5 1
2 2 6 1
3 3 7 1
4 3 8 1
5 3 9 1
6 5 10 2
7 5 11 2
8 5 12 2
Then I would like to get
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] NA 5 6 7 8 9 10 11 12
[2,] 2 1 1
[3,] 2
[4,] 3 1 1 1
[5,] 3
[6,] 3
[7,] 5 2 2 2
[8,] 5
[9,] 5
I left out all the NA's, except the first, where there is no z value,
say e.g. x=5 and y=8.
Do you see what I mean?
More information about the R-help
mailing list