[R] Can a matrix have 'list' as rows/columns?
William Dunlap
wdunlap at tibco.com
Wed Apr 18 05:14:31 CEST 2012
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Worik R
> Sent: Tuesday, April 17, 2012 4:28 PM
> To: r-help
> Subject: Re: [R] Can a matrix have 'list' as rows/columns?
>
> On Tue, Apr 17, 2012 at 11:52 PM, David Winsemius <dwinsemius at comcast.net>wrote:
>
> >
> > On Apr 17, 2012, at 12:13 AM, Worik R wrote:
> >
> > After a lot of processing I get a matrix into M. I expected each row and
> >> column to be a vector. But it is a list.
> >>
> >
> > This behavior is not the result of limitation in how R's sapply might have
> > processed a purely numeric set of results, but is because you (probably)
> > returned a hetergeneous set of classes rom you inner function. Assuming
> > that "last" is actually function(x){tail,1}, then the structure of M is
> >
> > str(M)
> > List of 6
> > [snip]
> > ..$ : chr [1:3] "aaa" "bbb" "ccc"
> >
> > Had the result been a more homogeneous collection, I sapply would have
> > returned an array of atomic numeric vectors. Try just returning a number:
> >
> > > M2 <- sapply(Qm, function(nm, DF){last(DF[DF[, "Name"]==nm,"Value"])},
> > DF)
> >
>
> Yes that returns a vector. I want a matrix.
>
> I see that my problem is that the columns of DF are not all the same type.
> Once I did that (made Value character) I get my matrix just as I need. SO
> it was I passed *in* that was the problem Not what I did with it inside
> sapply. In this case I would expect M to be a list. I am gobsmacked that
> a list can be considered a vector. Is that a bug? It must be bad design?
>
> I have been using R for a number of years (5?) and heavilly for two years.
> I am still getting bitten by these "features" in R. To my mind there are
> many places that R violates the *principle of least surprise. But it may
> be my mind that is at fault! What are other people's experience?*
Since a matrix may contain logical, integer, numeric (double precision),
complex, and character data, I would be surprised if it didn't also handle
list data. I am surprised that a matrix cannot contain factor data.
> z <- matrix(factor(letters[1:6], levels=letters[1:10]), nrow=2)
> z
[,1] [,2] [,3]
[1,] "a" "c" "e"
[2,] "b" "d" "f"
> str(z)
chr [1:2, 1:3] "a" "b" "c" "d" "e" "f"
Different things surprise different people.
You might try using vapply() instead of sapply(). It forces you
to supply what you expect the output of FUN(X[[i]]) to look like
and will stop with an explicit error message if it doesn't match
your expectation on any iteration.
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
>
> Worik
>
>
> > > class(M)
> > [1] "numeric"
> > > str(M2)
> > Named num [1:3] 0.6184 0.0446 0.3605
> > - attr(*, "names")= chr [1:3] "aaa" "bbb" "ccc"
> >
> > --
> > David.
> >
> >>
> >> R-Inferno says...
> >>
> >> "Arrays (including matrices) can be subscripted with a matrix of positive
> >> numbers. The subscripting matrix has as many columns as there are
> >> dimensions
> >> in the array-so two columns for a matrix. The result is a vector (not an
> >> array)
> >> containing the selected items."
> >>
> >> My version of R:
> >> version.string R version 2.12.1 (2010-12-16)
> >>
> >> Here is an example...
> >>
> >> Qm <- c("aaa", "bbb", "ccc")
> >>> DF <- data.frame(Name=sample(Qm, replace=TRUE, size=22), Value=runif(22),
> >>>
> >> stringsAsFactors=FALSE)
> >>
> >>> M <- sapply(Qm, function(nm, DF){last(DF[DF[, "Name"]==nm,])}, DF)
> >>> class(M)
> >>>
> >> [1] "matrix"
> >>
> >>> class(M[,1])
> >>>
> >> [1] "list"
> >>
> >>> class(M[1,])
> >>>
> >> [1] "list"
> >>
> >>> M
> >>>
> >> aaa bbb ccc
> >> Name "aaa" "bbb" "ccc"
> >> Value 0.4702648 0.274498 0.5529691
> >>
> >>> DF
> >>>
> >> Name Value
> >> 1 ccc 0.99948920
> >> 2 aaa 0.51921281
> >> 3 aaa 0.10803943
> >> 4 aaa 0.82265847
> >> 5 ccc 0.83237260
> >> 6 bbb 0.88250933
> >> 7 aaa 0.41836131
> >> 8 aaa 0.66197290
> >> 9 ccc 0.01911771
> >> 10 ccc 0.99994699
> >> 11 bbb 0.35719884
> >> 12 ccc 0.86274858
> >> 13 bbb 0.57528579
> >> 14 aaa 0.12452158
> >> 15 aaa 0.44167731
> >> 16 aaa 0.11660019
> >> 17 ccc 0.55296911
> >> 18 aaa 0.12796890
> >> 19 bbb 0.44595741
> >> 20 bbb 0.93024768
> >> 21 aaa 0.47026475
> >> 22 bbb 0.27449801
> >>
> >>>
> >>>
> >> [[alternative HTML version deleted]]
> >>
> >> ______________________________**________________
> >> R-help at r-project.org mailing list
> >> https://stat.ethz.ch/mailman/**listinfo/r-
> help<https://stat.ethz.ch/mailman/listinfo/r-help>
> >> PLEASE do read the posting guide http://www.R-project.org/**
> >> posting-guide.html <http://www.R-project.org/posting-guide.html>
> >> and provide commented, minimal, self-contained, reproducible code.
> >>
> >
> > David Winsemius, MD
> > West Hartford, CT
> >
> >
>
> [[alternative HTML version deleted]]
More information about the R-help
mailing list