This is a nice solution. Thanks, Dennis. But I am afraid if the length of the list x isn't equal to the length of x2, there will be errors since lapply returns a list of the same length.
> x <- list(A=c("d", "e", "f"), B=c("d", "e"), C=c("d","g")) > x2 <- unique(unlist(x)) > w <- lapply(x, function(u) names(x)[which(x2 %in% u)]) > names(w) <- x2 Error in names(w) <- x2 : 'names' attribute [4] must be the same length as the vector [3] On Fri, Aug 5, 2011 at 3:23 PM, Dennis Murphy <djmu...@gmail.com> wrote: > Hi: > > Your clarification suggests Duncan was on the right track, so how about this: > > x <- list(A=c("d", "e", "f"), B=c("d", "e"), C=c("d")) > x2 <- unique(unlist(x)) > w <- lapply(x, function(u) names(x)[which(x2 %in% u)]) > names(w) <- x2 > w > $d > [1] "A" "B" "C" > > $e > [1] "A" "B" > > $f > [1] "A" > > HTH, > Dennis > > On Fri, Aug 5, 2011 at 10:04 AM, zhenjiang xu <zhenjiang...@gmail.com> wrote: >> Exactly! Sorry I get others misunderstood. The uppercase/lowercase is >> only a toy example (and a bad one; yours is better than mine). My >> question is a more general one: a list is basically a one-to-many >> matching, from the names of a list to the elements belonging to each >> name. I'd like to reverse the matching, from all the elements to the >> names of the list. >> >> On Fri, Aug 5, 2011 at 12:53 PM, Duncan Murdoch >> <murdoch.dun...@gmail.com> wrote: >>> On 05/08/2011 12:05 PM, zhenjiang xu wrote: >>>> >>>> Hi R users, >>>> >>>> I have a list: >>>> > x >>>> $A >>>> [1] "a" "b" "c" >>>> $B >>>> [1] "b" "c" >>>> $C >>>> [1] "c" >>>> >>>> I want to convert it to a lowercase-to-uppercase list like this: >>>> > y >>>> $a >>>> [1] "A" >>>> $b >>>> [1] "A" "B" >>>> $c >>>> [1] "A" "B" "C" >>>> >>>> In a word, I want to reverse the list names and the elements under >>>> each list name. Is there any quick way to do that? Thanks >>> >>> I interpreted this question differently from the others, and your example is >>> ambiguous as to which is the right interpretation. I thought you wanted to >>> swap names and elements, so >>> >>>> x <- list(A=c("d", "e", "f"), B=c("d", "e"), C=c("d")) >>>> x >>> $A >>> [1] "d" "e" "f" >>> >>> $B >>> [1] "d" "e" >>> >>> $C >>> [1] "d" >>> >>> would become >>> >>>> list(d=c("A", "B", "C"), e=c("A", "B"), f="A") >>> $d >>> [1] "A" "B" "C" >>> >>> $e >>> [1] "A" "B" >>> >>> $f >>> [1] "A" >>> >>> I don't know a slick way to do this; I'd just do it by brute force, looping >>> over the names of x. >>> >>> Duncan Murdoch >>> >> >> >> >> -- >> Best, >> Zhenjiang >> >> ______________________________________________ >> 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. >> > -- Best, Zhenjiang ______________________________________________ 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.