#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)