[R] almost lower triangular matrices

Spencer Graves spencer.graves at pdf.com
Tue Mar 1 23:20:50 CET 2005


      Output from which program?  If the output is of class "dist", then 
"as.matrix" should give you what you want: 

 > set.seed(1)
 > X <- array(rnorm(12), dim=c(4,3))
 > (dX <- dist(X))
          1         2         3
2 1.6598683                   
3 0.9720025 2.4600033         
4 2.2666735 2.2149274 2.6890545
 > length(dX)
[1] 6
 > as.matrix(dX)
          1        2         3        4
1 0.0000000 1.659868 0.9720025 2.266674
2 1.6598683 0.000000 2.4600033 2.214927
3 0.9720025 2.460003 0.0000000 2.689054
4 2.2666735 2.214927 2.6890545 0.000000
 >
      hope this helps. 
      spencer graves

Douglas Bates wrote:

> Michael Anyadike-Danes wrote:
>
>> I have output from a program which produces a distance matrix I want to
>> read into a clustering program in R.
>>
>>  
>>
>> The output is a .txt file and is 'almost' lower triangular in the sense
>> that it is just the triangle below the diagonal.
>>
>>  
>>
>> So for example a 4-by-4 distance matrix appears as,
>>
>>  
>>
>> 1
>>
>> 2 3
>>
>> 4 5 6
>>
>>  
>>
>> i.e. it looks like a lower triangular of a 3-by3.
>>
>>  
>>
>> I thought I might be able to use "diag" to add zeros but apparently not.
>>
>>  
>>
>> It's a problem because my matrix is actually 1989-by-1989 not 4-by-4
>>
>>  
>>
>> I would not be at all surprised if the solution is obvious but I cannot
>> quite see how to read this into R.
>
>
> You can use scan to get the entries from the file in row order.  Then 
> create the matrix to hold the result and overwrite the elements in the 
> upper triangle with scanned vector.  (R stores matrices in 
> column-major order so the row-major order from your file corresponds 
> to the upper triangle, not the lower triangle).  I'll leave it to you 
> to work out the  symmetrization operation.
>
> > file.show("/tmp/tri.dat")
> 1
> 2 3
> 4 5 6
> 7 8 9 10
>
> > mm <- array(0, c(4,4))
> > mm[upper.tri(mm, diag = TRUE)] <- scan("/tmp/tri.dat")
> Read 10 items
> > mm
>      [,1] [,2] [,3] [,4]
> [1,]    1    2    4    7
> [2,]    0    3    5    8
> [3,]    0    0    6    9
> [4,]    0    0    0   10
> > (res <- mm + t(mm))
>      [,1] [,2] [,3] [,4]
> [1,]    2    2    4    7
> [2,]    2    6    5    8
> [3,]    4    5   12    9
> [4,]    7    8    9   20
> > diag(res) <- diag(res)/2
> > res
>      [,1] [,2] [,3] [,4]
> [1,]    1    2    4    7
> [2,]    2    3    5    8
> [3,]    4    5    6    9
> [4,]    7    8    9   10
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html




More information about the R-help mailing list