[R] a question on list manipulation

zhenjiang xu zhenjiang.xu at gmail.com
Sat Aug 6 17:12:12 CEST 2011


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 <djmuser at 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.xu at 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.duncan at 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 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.
>>
>



-- 
Best,
Zhenjiang



More information about the R-help mailing list