On Apr 17, 2012, at 7:27 PM, Worik R wrote:
On Tue, Apr 17, 2012 at 11:52 PM, David Winsemius <dwinsem...@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
______________________________________________
R-help@r-project.org 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.