> -----Original Message----- > From: r-help-boun...@r-project.org > [mailto:r-help-boun...@r-project.org] On Behalf Of Fabio Murtas > Sent: Sunday, August 09, 2009 1:51 PM > To: R-help@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 ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.