user8248672
user8248672

Reputation:

Find indexes of element in list that satisfies a condition in R

I have a list (I named it lst) with 150 elements, some of which contain 1:

list(integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), integer(0), integer(0), 
    integer(0), integer(0), integer(0), 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L)

How do I extract out the indexes of those elements that contain 1. The result would be 139 140 141 142 143 144 145 146 147 148 149 150.

I've tried:

unlist(lapply(lst, function(x) if (x == 1) x))

Upvotes: 1

Views: 1886

Answers (3)

akrun
akrun

Reputation: 886948

We can use setequal. Should also work when the lengths of vector is greater than 1 for each list element

which(sapply(lst, setequal, 1))
#[1] 139 140 141 142 143 144 145 146 147 148 149 150

Or with map from purrr

library(purrr)
which(map_lgl(lst, setequal, 1))
#[1] 139 140 141 142 143 144 145 146 147 148 149 150

Or another option is lengths

which(lengths(lst) == 1)

Upvotes: 0

Andrew
Andrew

Reputation: 5138

Will do, @Ronak. logical operators (i.e., ==) search in the first "level" of a list, and which returns the positions that are TRUE:

your_list == 1
  [1]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [27]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [53]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
 [79]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[105]   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA   NA
[131]   NA   NA   NA   NA   NA   NA   NA   NA TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

which(your_list == 1)
 [1] 139 140 141 142 143 144 145 146 147 148 149 150

Upvotes: 4

Ronak Shah
Ronak Shah

Reputation: 388817

The tricky part is because of integer(0) elements. We can use all.equal

which(sapply(lst, all.equal, 1) == TRUE)
#[1] 139 140 141 142 143 144 145 146 147 148 149 150

Upvotes: 0

Related Questions