[R] R- transform data frame into matrix

Dieter Menne dieter.menne at menne-biomed.de
Wed Nov 12 18:01:20 CET 2008


Thorsten Raff <t.raff <at> med2.uni-kiel.de> writes:

> I have the problem that I want to transform a dataframe as generated by
> 
> diagnosis <- rep(diagnosis[1:3], 3)
> marker <- gl(3,3)
> values <- rnorm(9)
> dataframe <- cbind(diagnosis, marker, values)
> dataframe <- dataframe[c(1:5, 7:9), ]
> 
> into a matrix where levels(diagnosis) is indicating the rows of the matrix, 
> levels(marker) the columns and values are the actual content of the matrix. 
> However, as can been seen in the dataframe, some observations are missing and 
> should result in <NAs> in the resulting matrix, giving a result like this:
> 
> marker              1         2         3
> diagnosis1      value   value   value
> diagnosis2      value   value   value
> diagnosis3      value      NA    value
> 

You can make your examples self-running by providing fake data for diagnosis,
e.g. using letters[] instead of diagnosis. In addition, note that your cbind has
an awkward side effect by converting everything to character as the least common
denominator for the variables in a matrix.

For real work, use reshape with its frightening number of parameters. If you
don't understand that function at the seventh reading, stay cool: it's not your
fault. You might also try package reshape, but it is not much easier for
occasional use.


Dieter


# 
diagnosis <- as.factor(rep(letters[1:3], 3))
marker <- as.factor(gl(3,3))
values <- rnorm(9)
dataframe <- data.frame(diagnosis=diagnosis, marker=marker, values=values)
dataframe <- dataframe[c(1:5, 7:9), ]

reshape(dataframe,idvar="diagnosis",direction="wide",timevar="marker")



More information about the R-help mailing list