Подтвердить что ты не робот

Извлечь ненулевые элементы из списка из R

У меня есть список вроде этого:

    x = list(a = 1:4, b = 3:10, c = NULL)
    x
    #$a
    #[1] 1 2 3 4
    #
    #$b
    #[1]  3  4  5  6  7  8  9 10
    #
    #$c
    #NULL

и я хочу извлечь все элементы, которые не являются нулевыми. Как это может быть сделано? Спасибо.

4b9b3361

Ответ 1

Вот еще один вариант:

Filter(Negate(is.null), x)

Ответ 2

Как насчет:

x[!unlist(lapply(x, is.null))]

Вот краткое описание того, что происходит.

  • lapply указывает, какие элементы NULL

    R> lapply(x, is.null)
    $a
    [1] FALSE
    
    $b
    [1] FALSE
    
    $c
    [1] TRUE
    
  • Затем мы конвектируем список в вектор:

    R> unlist(lapply(x, is.null)) 
    a     b     c 
    FALSE FALSE  TRUE 
    
  • Затем мы переключаем TRUE на FALSE:

    R> !unlist(lapply(x, is.null))
        a     b     c 
    TRUE  TRUE FALSE 
    
  • Наконец, мы выбираем элементы, используя обычные обозначения:

    x[!unlist(lapply(x, is.null))]
    

Ответ 3

x[!sapply(x,is.null)]

Это обобщает любое логическое утверждение о списке, просто подпишет в логике "is.null".

Ответ 4

Упрощение и, скорее, быстрее, чем указано выше, для списков любых нерекурсивных значений (в смысле is.recursive) работает следующее:

example_1_LST <- list(NULL, a=1.0, b=Matrix::Matrix(), c=NULL, d=4L)
example_2_LST <- as.list(unlist(example_1_LST, recursive=FALSE))

str(example_2_LST) Отпечатки:

List of 3
 $ a: num 1
 $ b:Formal class 'lsyMatrix' [package "Matrix"] with 5 slots
  .. [email protected] x       : logi NA
  .. [email protected] Dim     : int [1:2] 1 1
  .. [email protected] Dimnames:List of 2
  .. .. ..$ : NULL
  .. .. ..$ : NULL
  .. [email protected] uplo    : chr "U"
  .. [email protected] factors : list()
 $ d: int 4