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"

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help

Reply via email to