[R] Converting a data frame with values into a matrix/

Srinivas Iyyer srini_iyyer_bio at yahoo.com
Wed Mar 12 18:19:44 CET 2008


Dear Group, 
I have a data frame like the following:


x <- c("Mike","A",0.01)
x1 <- c("Carl","A",0.2)
x2 <- c("Gene","C",0.3)
x3 <- c("James","A",-0.3)
x4 <- c("Dough","B",0)
xx <- rbind(x,x1,x2,x3,x4)
colnames(xx)<-c("Name","Class","NES")
xx <-as.data.frame(xx)

> xx
    Name Class  NES
x   Mike     A 0.01
x1  Carl     A  0.2
x2  Gene     C  0.3
x3 James     A -0.3
x4 Dough     B    0


Now I want to create a matrix with unique xx$Name on
columns and unique xx$Class as rows.  I want to fill
my choice of values (in this case 1) if data point not
available. 


xy <-
matrix(1,length(unique(xx$Class)),length(unique(xx[,1])))
colnames(xy)<-unique(xx[,1])
rownames(xy)<-unique(xx$Class)

> xy
  Mike Carl Gene James Dough
A    1    1    1     1     1
C    1    1    1     1     1
B    1    1    1     1     1





I would love to have :

  Mike Carl Gene James Dough
A    0.01    0.2    1     -0.3     1
C    1    1    1     0.3     1
B    1    1    1     1    0




If I am not wrong this is called contigency or
frequeny table. 

I tried xtabs on this.  

> z <- xtabs(NES ~ Name+Class,data=xx)
Error in Summary.factor(4L, na.rm = FALSE) : 
  sum not meaningful for factors


I tried on other data frames, it worked. BUT the
problem is it gives me 0.0000 even a value is not
available for that row and column.  So if I have data
-0.00 it is considered 0. 

I tried. drop.unused.levels = T, I did not get what I
want. I want all row.col values not available to be 1.


Is there any other trick where I map by row and column
names instead of using advanced xtabs. 

thanks
Srini



More information about the R-help mailing list