[R] subscripts in lists
M.Kondrin
mkondrin at hppi.troitsk.ru
Tue Aug 12 02:10:41 CEST 2003
Chris Knight wrote:
>
> I am tying myself in knots over subscripts when applied to lists
>
> I have a list along the lines of:
>
> lis<-list(c("a","b","next","want1","c"),c("d", "next", "want2", "a"))
>
>> From which I want to extract the values following "next" in each
>
> member of the list, i.e. something along the lines of answer<-c(
> "want1", "want2"). Is this possible without using loops? The elements of
> lis are of different lengths and "next" occurs once per element
> somewhere in the middle.
>
> The thought process behind this is:
>
> It's easy enough to do it for an individual element of the list:
> lis[[1]][match("next",lis[[1]])+1]
>
> but how to do that to all elements of the list? I can get their indices
> e.g. as a list using lapply:
>
> lapply(lapply(lis,match,x="next"),"+",y=1)
>
> or return a particular subscript using:
> lapply(lis,"[", i=3)
>
> but don't see how one could combine the two to get answer<-c("want1",
> "want2") without resorting to:
>
> answer<-character
> for(s in 1:length(lis)){
> answer<-c(answer,lis[[s]][match("next",lis[[s]])+1])
> }
>
> Am I missing something obvious (or non-obvious)? I suppose the secondary
> question is 'should I care?'. I am intending to use this on hundreds of
> lists sometimes with tens of thousands of elements, with more than one
> version of "next" in each, so felt that the lower efficiency of looping
> was likely to matter.
> Any help much appreciated,
>
> Chris
> unlist(lis)[which(unlist(lis)=="next")+1]
[1] "want1" "want2"
More information about the R-help
mailing list