[R] Populate matrix from data.frame

Patrick Burns pburns at pburns.seanet.com
Thu Jun 28 11:28:17 CEST 2007


You need some caution with Brian's solution as it
depends on the matrix being in the same order as
the factors in the data frame.

a <- data.frame(cbind(x=c('a','a','a','b','c'), 
y=c('a','b','c','d','e'),z=c(1,2,3,4,5)))

mm <- matrix(0,5,5)
colnames(mm) <- c('a','b','c','d','e')
rownames(mm) <- c('a','b','c','d','e')

pp <- mm[5:1, 5:1]

mm[cbind(a$x, a$y)] <- a$z # desired result

pp[cbind(a$x, a$y)] <- a$z # not desired result

It would be nice if the following worked:

mm[cbind(as.character(a$x), as.character(a$y))] <- a$z


Patrick Burns
patrick at burns-stat.com
+44 (0)20 8525 0696
http://www.burns-stat.com
(home of S Poetry and "A Guide for the Unwilling S User")

Prof Brian Ripley wrote:

>On Thu, 28 Jun 2007, Andrej Kastrin wrote:
>
>  
>
>>Dear all,
>>
>>I have a data frame
>>a <- data.frame(cbind(x=c('a','a','a','b','c'),
>>y=c('a','b','c','d','e'),z=c(1,2,3,4,5)))
>>    
>>
>>>a
>>>      
>>>
>> x y z
>>1 a a 1
>>2 a b 2
>>3 a c 3
>>4 b d 4
>>5 c e 5
>>
>>and a matrix
>>mm <- matrix(0,5,5)
>>colnames(mm) <- c('a','b','c','d','e')
>>rownames(mm) <- c('a','b','c','d','e')
>>    
>>
>>>mm
>>>      
>>>
>> a b c d e
>>a 0 0 0 0 0
>>b 0 0 0 0 0
>>c 0 0 0 0 0
>>d 0 0 0 0 0
>>e 0 0 0 0 0
>>
>>How to populate matrix in a way that first column of data frame 'a'
>>correspond to rownames(mm), second column to colnames(mm) and the third
>>column is the element of matrix 'mm'?
>>    
>>
>
>mm[cbind(a$x, a$y)] <- a$z
>
>Please read about the forms of indexing matrices in 'An Introduction to 
>R'.
>
>  
>



More information about the R-help mailing list