在满足R条件的列表中查找元素的索引

时间:2019-03-29 13:45:17

标签: r

我有一个包含150个元素的列表(我将其命名为lst),其中一些元素包含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))

3 个答案:

答案 0 :(得分:2)

会的,@ 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

答案 1 :(得分:0)

棘手的部分是由于integer(0)元素。我们可以使用all.equal

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

答案 2 :(得分:0)

我们可以使用setequal。当每个list元素的向量长度大于1时,

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)