On Tue, Apr 17, 2012 at 11:52 PM, David Winsemius <dwinsemius@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?*

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@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]]

