[R] problem adding columns to matrix

Daniel Nordlund djnordlund at verizon.net
Mon Aug 10 01:51:15 CEST 2009


> -----Original Message-----
> From: r-help-bounces at r-project.org 
> [mailto:r-help-bounces at r-project.org] On Behalf Of Fabio Murtas
> Sent: Sunday, August 09, 2009 1:51 PM
> To: R-help at r-project.org
> Subject: [R] problem adding columns to matrix
> 
> Hi all, i purchased a copy of the book Morphometrics with R 
> by Springer.
> at the end of each chapter there are exercises to train what 
> you just  
> read and (hope) learned...
> 
> so i have this problem:
> 
> Define a hypothetical data frame containing five measurments 
> normally  
> distributed(size,head,pectoral,area,weight) for four individuals  
> (named ind1, ind2, etc). ADD A COLUMN corresponding to the 
> factor sex  
> with individual 1 & 2 being Males and 3 & $ being Females.
> 
> 
> 
> HERE IS HOW I PROCEDED, getting 2 problems
> 1) what are those warning messages i got when i generate the 
> m matrix  
> (the italian text stand for "the numerical expression has 5 
> elements:  
> just the first is used")
> 2) why when i use cbind to add the s factor wit M,M,F,F,   
> (sexes) to  
> the m matrix i get numerical values 1 & 2 instead of 
> character values  
> M & F?
> 
> --------------------------------------------------------------
> ----------------------------------------
> procedure follows:
> 
>  > a<- rnorm(5, 20, 7)
>  > a
> [1] 27.32586 34.07330 21.11710 25.85710 22.68296
>  > a
> [1] 27.32586 34.07330 21.11710 25.85710 22.68296
>  > b<- rnorm(5, 20, 7)
>  >
>  > d<- rnorm(5, 20, 7)
>  >
>  >
>  > e<- rnorm(5, 20, 7)
> 
>  > m<-matrix(a:e, 4,5)
> Warning messages:
> 1: In a:e :
>   l'espressione numerica ha 5 elementi: solo il primo è utilizzato
> 2: In a:e :
>   l'espressione numerica ha 5 elementi: solo il primo è utilizzato
> 3: In matrix(a:e, 4, 5) :
>   data length [3] is not a sub-multiple or multiple of the number of  
> rows [4]
>  >
>  > m
>          [,1]     [,2]     [,3]     [,4]     [,5]
> [1,] 27.32586 28.32586 29.32586 27.32586 28.32586
> [2,] 28.32586 29.32586 27.32586 28.32586 29.32586
> [3,] 29.32586 27.32586 28.32586 29.32586 27.32586
> [4,] 27.32586 28.32586 29.32586 27.32586 28.32586
> 
>  > m<-as.data.frame(m)
>  > m
>         V1       V2       V3       V4       V5
> 1 27.32586 28.32586 29.32586 27.32586 28.32586
> 2 28.32586 29.32586 27.32586 28.32586 29.32586
> 3 29.32586 27.32586 28.32586 29.32586 27.32586
> 4 27.32586 28.32586 29.32586 27.32586 28.32586
>  > mode(m)
> [1] "list"
>  > colnames(m)<-c("size","head","pectoral","area","weight")
>  > mode(m)
> [1] "list"
>  >
>  > m
>       size     head pectoral     area   weight
> 1 27.32586 28.32586 29.32586 27.32586 28.32586
> 2 28.32586 29.32586 27.32586 28.32586 29.32586
> 3 29.32586 27.32586 28.32586 29.32586 27.32586
> 4 27.32586 28.32586 29.32586 27.32586 28.32586
> 
>  >rownames(m)<-paste("ind", 1:4, sep="")
>  >
>  >
>  > m
>          size     head pectoral     area   weight
> ind1 27.32586 28.32586 29.32586 27.32586 28.32586
> ind2 28.32586 29.32586 27.32586 28.32586 29.32586
> ind3 29.32586 27.32586 28.32586 29.32586 27.32586
> ind4 27.32586 28.32586 29.32586 27.32586 28.32586
> 
>  > s<-factor(c("m","m","f","f"))
>  >
>  >
>  > s
> [1] m m f f
> Levels: f m
>  > cbind(m,s)
>          size     head pectoral     area   weight s
> ind1 27.32586 28.32586 29.32586 27.32586 28.32586 2
> ind2 28.32586 29.32586 27.32586 28.32586 29.32586 2
> ind3 29.32586 27.32586 28.32586 29.32586 27.32586 1
> ind4 27.32586 28.32586 29.32586 27.32586 28.32586 1
>  >
> --------------------------------------------------------------
> ----------------------------------------
> 
> Thanks in advance
> 

Fabio,

For question 1, the warning message is telling you that 

m<-matrix(a:e, 4,5)

Is not doing what you think it is.  The syntax a:e creates a sequence, but
it is expecting a to be a single number, not a vector.  So, it is telling
you that it is only going to use the first value from  vector a.  Likewise,
it will only use the first value of vector e for the end value.  So
effectively, you statement gets interpreted as

m<-matrix(a[1]:e[1], 4,5)  

Based on the random numbers you generated this created a sequence of
length=3.  You matrix was then created using just those 3 numbers (the first
3 numbers in the first column of your matrix) and recycled them as needed to
fill out the matrix.

You probably should have create the data frame directly, something like

df <- data.frame(rbind(a,b,d,e))

As for question 2, I don't know why you got the values 1,2 in your data
frame.  When I ran your R code, the data frame I ended up with had the
values 'm', 'f'.  The values 1,2 are the underlying numeric values of the
factror you created, but why they showed up, I don't know.  It could have to
do with different versions of R, and or operating systems, etc., which you
told us nothing about.  I am using R-2.9.1 on Win XP Pro.

Hope this is helpful,

Dan

Daniel Nordlund
Bothell, WA USA  




More information about the R-help mailing list