[R] objects of class "matrix" and mode "list"? [Broadcast]
Liaw, Andy
andy_liaw at merck.com
Fri Mar 23 23:55:38 CET 2007
It may help to (re-)read ?sapply a bit more in detail. Simplification
is done only if it's "possible", and what "possible" means is defined
there.
A list is a vector whose elements can be different objects, but a vector
nonetheless. Thus a list can have dimensions. E.g.,
R> a <- list(1, 1:2, 3, c("abc", "def"))
R> dim(a) <- c(2, 2)
R> a
[,1] [,2]
[1,] 1 3
[2,] Integer,2 Character,2
That sometimes can be extremely useful (not like the example above!).
Andy
From: Stephen Tucker
>
> Hello everyone,
>
> I cannot seem to find information about objects of class
> "matrix" and mode
> "list", and how to handle them (apart from flattening the
> list). I get this
> type of object from using sapply(). Sorry for the long
> example, but the code
> below illustrates how I get this type of object. Is anyone aware of
> documentation regarding this object?
>
> Thanks very much,
>
> Stephen
>
> ===== begin example ====
>
> # I am just making up a fake data set
> df <- data.frame(Day=rep(1:3,each=24),Hour=rep(1:24,times=3),
> Name1=rnorm(24*3),Name2=rnorm(24*3))
>
> # define a function to get a set of descriptive statistics
> tmp <- function(x) {
> # this function will accept a data frame
> # and return a 1-row data frame of
> # max value, colname of max, min value, and colname of min
> return(data.frame(maxval=max(apply(x,2,max)),
> maxloc=names(x)[which.max(apply(x,2,max))],
> minval=min(apply(x,2,min)),
> minloc=names(x)[which.min(apply(x,2,min))]))
> }
>
> # Now applying function to data:
> # (1) split the data table by Day with split()
> # (2) apply the tmp function defined above to each data frame from (1)
> # using lapply()
> # (3) transpose the final matrix and convert it to a data frame
> # with mixed characters and numbers
> # using as.data.frame(), lapply(), and type.convert()
>
> > final <-
> as.data.frame(lapply(as.data.frame(t(sapply(split(df[,-c(1:2)],
> +
> f=df$Day),tmp))),
> + type.convert,as.is=TRUE))
> Error in type.convert(x, na.strings, as.is, dec) :
> the first argument must be of mode character
>
> I thought sapply() would give me a data frame or matrix, which I would
> transpose into a character matrix, to which I can apply type.convert()
> and get the same matrix as what I would get from these two lines (Fold
> function taken from Gabor's post on R-help a few years ago):
>
> Fold <- function(f, x, L) for(e in L) x <- f(x, e)
> final2 <- Fold(rbind,vector(),lapply(split(df[,-c(1:2)],f=day),tmp))
>
> > print(c(class(final2),mode(final2)))
> [1] "data.frame" "list"
>
> ====================================================
> However, by my original method, sapply() gives me a matrix
> with mode, "list"
>
> intermediate1 <- sapply(split(df[,-c(1:2)],f=df$Day),tmp)
> > print(c(class(intermediate1),mode(intermediate1)))
> [1] "matrix" "list"
>
> Transposing, still a matrix with mode list, not character:
>
> intermediate2 <- t(sapply(split(df[,-c(1:2)],f=day),tmp))
> > print(c(class(intermediate2),mode(intermediate2)))
> [1] "matrix" "list"
>
> Unclassing gives me the same thing...
>
> > print(c(class(unclass(intermediate2)),mode(unclass(intermediate2))))
> [1] "matrix" "list"
>
>
>
>
>
> ______________________________________________________________
> ______________________
> Be a PS3 game guru.
>
> ______________________________________________
> R-help at stat.math.ethz.ch 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.
>
>
>
------------------------------------------------------------------------------
Notice: This e-mail message, together with any attachments,...{{dropped}}
More information about the R-help
mailing list