[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 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
>>>
>>>>
>>>>

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list