[R] indexing lists

David Winsemius dwinsemius at comcast.net
Mon Nov 15 22:57:56 CET 2010


On Nov 15, 2010, at 4:24 PM, Chris Carleton wrote:

> Hi List,
>
> I'm trying to work out how to use which(), or another function, to  
> find the
> top-level index of a list item based on a condition. An example will  
> clarify
> my question.
>
> a <- list(c(1,2),c(3,4))
> a
> [[1]]
> [1] 1 2
>
> [[2]]
> [1] 3 4
>
> I want to find the top level index of c(1,2), which should return 1  
> since;
>
> a[[1]]
> [1] 1 2
>
> I can't seem to work out the syntax. I've tried;
>
> which(a == c(1,2))

It's a bit more involved than that (since which is expecting a vector  
of logicals and mapply is expecting a set of list arguments.) I needed  
to send mapply a MoreArgs list that would remain constant from test to  
test when using identical.

 > which(mapply(identical, a, MoreArgs=list(c(1,2))))
[1] 1

(Admittedly very similar to Iverson's solution, but it is more  
readable to my eyes. On the other hand my method may stumble on more  
complex object with attributes. You should read hte identical help  
page at any rate.)

>
> and an error about coercing to double is returned. I can find the  
> index of
> elements of a particular item by
>
> which(a[[1]]==c(1,2)) or which(a[[1]]==1) etc that return [1] 1 2  
> and [1] 1
> respectively as they should.

But neither was testing the "overall equality" of a[1]'s contents with  
c(1,2) which appears to be your goal. Iverson's "all" and my  
"identical" accomplish that goal.

> Any thoughts?
>
> C

-- 

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list