Re: [R] sapply problem
Sundar Dorai-Raj wrote: > > > Joerg van den Hoff said the following on 12/14/2006 7:30 AM: >> I have encountered the following problem: I need to extract from >> a list of lists equally named compenents who happen to be 'one row' >> data frames. a trivial example would be: >> >> a <- list(list( >> df = data.frame(A = 1, B = 2, C = 3)), list(df = data.frame(A = 4,B = >> 5,C = 6))) >> >> I want the extracted compenents to fill up a matrix or data frame row >> by row. >> the obvious thing to do seems: >> >> b <- sapply(a, "[[", "df") >> b <- t(b) >> >> now `b' looks all right: >> >> b >> class(b) >> >> but it turns out that all elements in this matrix are one element lists: >> >> class(b[1,1]) >> >> which prevents any further standard processing of `b' (like >> `colMeans', e.g.) >> >> question 1: is their a straightforward way to enforce that `b' contains >> simple numbers as elements right from the start (instead of something >> like >> apply(b, 1:2, "class<-", "numeric") afterwards)? >> > > Try this: > > a <- list(list(df = data.frame(A = 1, B = 2, C = 3)), > list(df = data.frame(A = 4, B = 5, C = 6))) > b <- do.call("rbind", sapply(a, "[", "df")) > b > > >> question 2: should not sapply do this further 'simplification' anyway >> in a situation >> like this (matrix elements turn out to be one-element lists)? >> > > I think it does as it much as it knows how. I think you might believe > that matrix elements can only contain numeric values. This is not a > valid assumption. Take this example: > > > a <- list(1) > > b <- list(2) > > (m <- matrix(c(a, b), 2, 1)) > [,1] > [1,] 1 > [2,] 2 > > class(m[1, 1]) > [1] "list" > > class(m[2, 1]) > [1] "list" > > HTH, > > --sundar > >> regards >> >> joerg >> thanks for the help to everybody. the proposal of sundar seems the most concise one (if it is also efficient I'll see with larger data sets ..). with regards to my question no. 2: sure I realize that I _can_ have a sensible matrix consisting of elements that are lists. with regards to `sapply' and the intention (as I understand it) to simplify as much as is sensible possible (`sapply' unlists usually everything it can), I think it would be desirable if `sapply' would detect this admittedly very special case: "a matrix of one-element lists whose sole list elements are atomic of length 1" (which was my case and is exactly your example above). of course, I don't know whether such a special treatment (probably meaning further recursive tests in `sapply') would slow down `sapply' significantly in general (which would be an argument against such a change of `sapply') or maybe it is against the actual purpose of sapply -- I'm not sure. anyway, thanks again, joerg __ R-help@stat.math.ethz.ch 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.
Re: [R] sapply problem
Joerg van den Hoff said the following on 12/14/2006 7:30 AM: > I have encountered the following problem: I need to extract from > a list of lists equally named compenents who happen to be 'one row' > data frames. a trivial example would be: > > a <- list(list( > df = data.frame(A = 1, B = 2, C = 3)), list(df = data.frame(A = 4,B = 5,C = > 6))) > > I want the extracted compenents to fill up a matrix or data frame row by row. > the obvious thing to do seems: > > b <- sapply(a, "[[", "df") > b <- t(b) > > now `b' looks all right: > > b > class(b) > > but it turns out that all elements in this matrix are one element lists: > > class(b[1,1]) > > which prevents any further standard processing of `b' (like `colMeans', e.g.) > > question 1: is their a straightforward way to enforce that `b' contains > simple numbers as elements right from the start (instead of something like > apply(b, 1:2, "class<-", "numeric") afterwards)? > Try this: a <- list(list(df = data.frame(A = 1, B = 2, C = 3)), list(df = data.frame(A = 4, B = 5, C = 6))) b <- do.call("rbind", sapply(a, "[", "df")) b > question 2: should not sapply do this further 'simplification' anyway in a > situation > like this (matrix elements turn out to be one-element lists)? > I think it does as it much as it knows how. I think you might believe that matrix elements can only contain numeric values. This is not a valid assumption. Take this example: > a <- list(1) > b <- list(2) > (m <- matrix(c(a, b), 2, 1)) [,1] [1,] 1 [2,] 2 > class(m[1, 1]) [1] "list" > class(m[2, 1]) [1] "list" HTH, --sundar > regards > > joerg > > __ > R-help@stat.math.ethz.ch 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. __ R-help@stat.math.ethz.ch 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.
Re: [R] sapply problem
> c <- apply(b, c(1,2), unlist) > c A B C [1,] 1 2 3 [2,] 4 5 6 > class(c[1,1]) [1] "numeric" On 12/14/06, Joerg van den Hoff <[EMAIL PROTECTED]> wrote: > I have encountered the following problem: I need to extract from > a list of lists equally named compenents who happen to be 'one row' > data frames. a trivial example would be: > > a <- list(list( > df = data.frame(A = 1, B = 2, C = 3)), list(df = data.frame(A = 4,B = 5,C = > 6))) > > I want the extracted compenents to fill up a matrix or data frame row by row. > the obvious thing to do seems: > > b <- sapply(a, "[[", "df") > b <- t(b) > > now `b' looks all right: > > b > class(b) > > but it turns out that all elements in this matrix are one element lists: > > class(b[1,1]) > > which prevents any further standard processing of `b' (like `colMeans', e.g.) > > question 1: is their a straightforward way to enforce that `b' contains > simple numbers as elements right from the start (instead of something like > apply(b, 1:2, "class<-", "numeric") afterwards)? > > question 2: should not sapply do this further 'simplification' anyway in a > situation > like this (matrix elements turn out to be one-element lists)? > > regards > > joerg > > __ > R-help@stat.math.ethz.ch 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. > -- Weiwei Shi, Ph.D Research Scientist GeneGO, Inc. "Did you always know?" "No, I did not. But I believed..." ---Matrix III __ R-help@stat.math.ethz.ch 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.
Re: [R] sapply problem
try this: > b <- as.matrix(do.call('rbind', lapply(a,'[[','df'))) > str(b) num [1:2, 1:3] 1 4 2 5 3 6 - attr(*, "dimnames")=List of 2 ..$ : chr [1:2] "1" "2" ..$ : chr [1:3] "A" "B" "C" > colMeans(b) A B C 2.5 3.5 4.5 > b A B C 1 1 2 3 2 4 5 6 > On 12/14/06, Joerg van den Hoff <[EMAIL PROTECTED]> wrote: > > I have encountered the following problem: I need to extract from > a list of lists equally named compenents who happen to be 'one row' > data frames. a trivial example would be: > > a <- list(list( > df = data.frame(A = 1, B = 2, C = 3)), list(df = data.frame(A = 4,B = 5,C > = 6))) > > I want the extracted compenents to fill up a matrix or data frame row by > row. > the obvious thing to do seems: > > b <- sapply(a, "[[", "df") > b <- t(b) > > now `b' looks all right: > > b > class(b) > > but it turns out that all elements in this matrix are one element lists: > > class(b[1,1]) > > which prevents any further standard processing of `b' (like `colMeans', > e.g.) > > question 1: is their a straightforward way to enforce that `b' contains > simple numbers as elements right from the start (instead of something like > apply(b, 1:2, "class<-", "numeric") afterwards)? > > question 2: should not sapply do this further 'simplification' anyway in a > situation > like this (matrix elements turn out to be one-element lists)? > > regards > > joerg > > __ > R-help@stat.math.ethz.ch 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. > -- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve? [[alternative HTML version deleted]] __ R-help@stat.math.ethz.ch 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.
[R] sapply problem
I have encountered the following problem: I need to extract from a list of lists equally named compenents who happen to be 'one row' data frames. a trivial example would be: a <- list(list( df = data.frame(A = 1, B = 2, C = 3)), list(df = data.frame(A = 4,B = 5,C = 6))) I want the extracted compenents to fill up a matrix or data frame row by row. the obvious thing to do seems: b <- sapply(a, "[[", "df") b <- t(b) now `b' looks all right: b class(b) but it turns out that all elements in this matrix are one element lists: class(b[1,1]) which prevents any further standard processing of `b' (like `colMeans', e.g.) question 1: is their a straightforward way to enforce that `b' contains simple numbers as elements right from the start (instead of something like apply(b, 1:2, "class<-", "numeric") afterwards)? question 2: should not sapply do this further 'simplification' anyway in a situation like this (matrix elements turn out to be one-element lists)? regards joerg __ R-help@stat.math.ethz.ch 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.