# [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