[R] Can a matrix have 'list' as rows/columns?
David Winsemius
dwinsemius at comcast.net
Wed Apr 18 02:15:48 CEST 2012
On Apr 17, 2012, at 7:27 PM, Worik R wrote:
> 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?
No. It is by design. "list" is an acceptable storage mode for vector().
> It must be bad design?
That is (obviously) a matter of opinion. R is in the middle region
between LiSP and a strongly typed language.
>
> 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.
I keep getting surprises as well. I did experience surprise at the
point I saw that is.vector() returning TRUE for a list. I think that
means that is.vector is rather less informative than I expected.
Essentially only language objects fail:
> z <- as.formula("x ~ y")
> z
x ~ y
> is.vector(z)
[1] FALSE
Even expressions are vectors:
> z <- expression( x ~ y)
> z
expression(x ~ y)
> is.vector(z)
[1] TRUE
> But it may
> be my mind that is at fault! What are other people's experience?*
I still have not fully wrapped my head around the higher levels of the
language. I thought reading Chamber's book would help, but it had too
much prose and did not present enough worked examples to sync with my
learning style. I'm still looking for a book that lets me use the
language more effectively.
--
David.
>
> 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 arrayso 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
>>>
>>>>
>>>>
David Winsemius, MD
West Hartford, CT
More information about the R-help
mailing list