Jacob Wegelin
2003-Oct-17 00:23 UTC
[R] as.matrix does not turn data frame into character matrix
The as.matrix function behaves in a puzzling manner. The help file says: "`as.matrix' is a generic function. The method for data frames will convert any non-numeric column into a character vector using `format' and so return a character matrix." But this does not appear to be the case in the following example. Instead, as.matrix turns a data.frame into a list, not a character matrix, which wreaks havoc with my old code. junk<- structure(list(SUBNUM = structure(c(3, 4, 5, 7, 6), class = "factor", .Label = c("01", "02", "03", "04", "07", "08", "09", "10", "11", "12", "13", "16", "17", "18", "21", "22", "23", "24", "25", "26", "27", "28")), AGE = c(7, 7, 10, 8, 5), DIAGNOSI = c(1, 1, 1, 1, 1), cortrange structure(list( "03" = 19.0674, "04" = 40.3009, "07" = 37.0205, "09" = 8.84131, "08" = 10.9855), .Names = c("03", "04", "07", "09", "08" )), logcortrange = structure(list("03" = 1.90097866386896, "04" = 2.75040785570225, "07" = 3.15633470025647, "09" 2.56744094585387, "08" = 2.84160608522206), .Names = c("03", "04", "07", "09", "08"))), .Names = c("SUBNUM", "AGE", "DIAGNOSI", "cortrange", "logcortrange"), row.names = c("03", "04", "07", "09", "08"), class "data.frame")> junkSUBNUM AGE DIAGNOSI cortrange logcortrange 03 03 7 1 19.0674 1.900979 04 04 7 1 40.3009 2.750408 07 07 10 1 37.0205 3.156335 09 09 8 1 8.84131 2.567441 08 08 5 1 10.9855 2.841606> jank<-as.matrix(junk) > jankSUBNUM AGE DIAGNOSI cortrange logcortrange 03 "03" 7 1 19.0674 1.900979 04 "04" 7 1 40.3009 2.750408 07 "07" 10 1 37.0205 3.156335 09 "09" 8 1 8.84131 2.567441 08 "08" 5 1 10.9855 2.841606 Notice that the first column is character, whereas the other columns are plain numeric! This is *not* a matrix of character.> dput(jank)structure(list("03", "04", "07", "09", "08", 7, 7, 10, 8, 5, 1, 1, 1, 1, 1, 19.0674, 40.3009, 37.0205, 8.84131, 10.9855, 1.90097866386896, 2.75040785570225, 3.15633470025647, 2.56744094585387, 2.84160608522206), .Dim = c(5, 5), .Dimnames = list(c("03", "04", "07", "09", "08"), c("SUBNUM", "AGE", "DIAGNOSI", "cortrange", "logcortrange"))) Is this a bug? One result of this:> cbind(dimnames(jank)[[1]], jank)Error in cbind(...) : cannot create a matrix from these types (I'm using version 7.0, because the links for downloading version 7.1 are dead today:)> version_ platform i386-pc-mingw32 arch i386 os mingw32 system i386, mingw32 status major 1 minor 7.0 year 2003 month 04 day 16 language R Thanks for any information. Jake
Prof Brian Ripley
2003-Oct-17 06:45 UTC
[R] as.matrix does not turn data frame into character matrix
At least in R 1.8.0 it is a list matrix:> class(jank)[1] "matrix"> typeof(jank)[1] "list" The help page is not quite correct, as it does not mention what happens when you create a data frame with a *list* as a column. How did you create this data frame? Columns cortrange and logcortrange are surely intended to be numeric columns, and it is pretty moot point if it is a valid data frame (it should not be possible to create it with data.frame, for example, and do.call("data.frame", unclass(junk)) fails). Please note that R 1.8.0 is current: we are nowhere near` 7.0 or `7.0'. A lot of error-checking/correction in the data.frame area was added in 1.8.0. On Thu, 16 Oct 2003, Jacob Wegelin wrote:> > The as.matrix function behaves in a puzzling manner. The help file says: > "`as.matrix' is a generic function. The method for data frames will > convert any non-numeric column into a character vector using > `format' and so return a character matrix." > But this does not appear to be the case in the following example. Instead, > as.matrix turns a data.frame into a list, not a character matrix, which > wreaks havoc with my old code. > > junk<- > structure(list(SUBNUM = structure(c(3, 4, 5, 7, 6), class = "factor", > .Label = c("01", > "02", "03", "04", "07", "08", "09", "10", "11", "12", "13", "16", > "17", "18", "21", "22", "23", "24", "25", "26", "27", "28")), > AGE = c(7, 7, 10, 8, 5), DIAGNOSI = c(1, 1, 1, 1, 1), cortrange > structure(list( > "03" = 19.0674, "04" = 40.3009, "07" = 37.0205, "09" = 8.84131, > "08" = 10.9855), .Names = c("03", "04", "07", "09", "08" > )), logcortrange = structure(list("03" = 1.90097866386896, > "04" = 2.75040785570225, "07" = 3.15633470025647, "09" > 2.56744094585387, > "08" = 2.84160608522206), .Names = c("03", "04", "07", > "09", "08"))), .Names = c("SUBNUM", "AGE", "DIAGNOSI", "cortrange", > "logcortrange"), row.names = c("03", "04", "07", "09", "08"), class > "data.frame") > > > junk > SUBNUM AGE DIAGNOSI cortrange logcortrange > 03 03 7 1 19.0674 1.900979 > 04 04 7 1 40.3009 2.750408 > 07 07 10 1 37.0205 3.156335 > 09 09 8 1 8.84131 2.567441 > 08 08 5 1 10.9855 2.841606 > > > jank<-as.matrix(junk) > > jank > SUBNUM AGE DIAGNOSI cortrange logcortrange > 03 "03" 7 1 19.0674 1.900979 > 04 "04" 7 1 40.3009 2.750408 > 07 "07" 10 1 37.0205 3.156335 > 09 "09" 8 1 8.84131 2.567441 > 08 "08" 5 1 10.9855 2.841606 > > Notice that the first column is character, whereas the other columns are plain numeric! > This is *not* a matrix of character. > > > dput(jank) > structure(list("03", "04", "07", "09", "08", 7, 7, 10, 8, 5, > 1, 1, 1, 1, 1, 19.0674, 40.3009, 37.0205, 8.84131, 10.9855, > 1.90097866386896, 2.75040785570225, 3.15633470025647, 2.56744094585387, > 2.84160608522206), .Dim = c(5, 5), .Dimnames = list(c("03", > "04", "07", "09", "08"), c("SUBNUM", "AGE", "DIAGNOSI", "cortrange", > "logcortrange"))) > > Is this a bug? > > One result of this: > > > cbind(dimnames(jank)[[1]], jank) > Error in cbind(...) : cannot create a matrix from these types > > (I'm using version 7.0, because the links for downloading version 7.1 are dead today:) > > > version > _ > platform i386-pc-mingw32 > arch i386 > os mingw32 > system i386, mingw32 > status > major 1 > minor 7.0 > year 2003 > month 04 > day 16 > language R > > Thanks for any information. > > Jake > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://www.stat.math.ethz.ch/mailman/listinfo/r-help > >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595