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. 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"> Maaa bbb ccc Name "aaa" "bbb" "ccc" Value 0.4702648 0.274498 0.5529691> DFName 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]]
On Mon, Apr 16, 2012 at 9:13 PM, Worik R <worikr at gmail.com> 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.Lists are also vectors, e.g.> x <- list() > is.vector(x)[1] TRUE> y <- vector("list", length=3) > str(y)List of 3 $ : NULL $ : NULL $ : NULL>See ?list /HB> > 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 > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >
That is a fine section of 'The R Inferno' but I don't think it applies to your problem. The answer to your question in the subject line is obviously "yes". It happens when the matrix (or more generally any array) is of mode "list". A useful example of this is in Circle 8.1.8. http://www.burns-stat.com/pages/Tutor/R_inferno.pdf In your case you can do things like: > M[[1,1]] [1] "aaa" > M[[1,2]] [1] "bbb" > M[[2,2]] [1] 0.274498 But not: > M[[,2]] Error in M[[, 2]] : invalid subscript type 'symbol' Pat On 17/04/2012 05:13, 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. > > 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 > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.-- Patrick Burns pburns at pburns.seanet.com twitter: @portfolioprobe http://www.portfolioprobe.com/blog http://www.burns-stat.com (home of 'Some hints for the R beginner' and 'The R Inferno')
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 $ : chr "aaa" $ : num 0.224 $ : chr "bbb" $ : num 0.768 $ : chr "ccc" $ : num 0.904 - attr(*, "dim")= int [1:2] 2 3 - attr(*, "dimnames")=List of 2 ..$ : chr [1:2] "Name" "Value" ..$ : 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) > 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 > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.David Winsemius, MD West Hartford, CT