Найти индексы элемента в списке, который удовлетворяет условию в R

#r

#r

Вопрос:

У меня есть список (я назвал его lst ) из 150 элементов, некоторые из которых содержат 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)
  

Как мне извлечь индексы тех элементов, которые содержат 1 . Результатом будет 139 140 141 142 143 144 145 146 147 148 149 150 .

Я пытался:

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

Комментарии:

1. Попробуйте Filter(length, your_list) получить ВСЕ элементы, которые не integer(0)

2. Это список с элементами длиной один? Если да, то почему бы не преобразовать его в вектор, прежде чем пытаться с ним работать?

3. @Julian_Hn Если я попытаюсь, as.vector(unlist(lst)) это просто удалит integer(0) элементы, так что нехорошо

4. Как насчет which(your_list == 1)

Ответ №1:

Будет сделано, @Ronak. логические операторы (т.Е. == ) выполняют поиск на первом «уровне» списка и which возвращают позиции, которые являются 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
  

Ответ №2:

Сложная часть связана с integer(0) элементами. Мы можем использовать all.equal

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

Ответ №3:

Мы можем использовать setequal . Также должно работать, когда длина вектора больше 1 для каждого list элемента

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

Или с помощью map из purrr

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

Или другой вариант lengths

 which(lengths(lst) == 1)