Extract non null elements from a list in R

后端 未结 4 533
别跟我提以往
别跟我提以往 2020-12-08 19:59

I have a list like this:

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


        
相关标签:
4条回答
  • 2020-12-08 20:16

    Here's another option:

    Filter(Negate(is.null), x)
    
    0 讨论(0)
  • 2020-12-08 20:18

    What about:

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

    Here is a brief description of what is going on.

    1. lapply tells us which elements are NULL

      R> lapply(x, is.null)
      $a
      [1] FALSE
      
      $b
      [1] FALSE
      
      $c
      [1] TRUE
      
    2. Next we convect the list into a vector:

      R> unlist(lapply(x, is.null)) 
      a     b     c 
      FALSE FALSE  TRUE 
      
    3. Then we switch TRUE to FALSE:

      R> !unlist(lapply(x, is.null))
          a     b     c 
      TRUE  TRUE FALSE 
      
    4. Finally, we select the elements using the usual notation:

      x[!unlist(lapply(x, is.null))]
      
    0 讨论(0)
  • 2020-12-08 20:19
    x[!sapply(x,is.null)]
    

    This generalizes to any logical statement about the list, just sub in the logic for "is.null".

    0 讨论(0)
  • 2020-12-08 20:23

    Simpler and likely quicker than the above, the following works for lists of any non-recursive (in the sense of is.recursive) values:

    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) prints:

    List of 3
     $ a: num 1
     $ b:Formal class 'lsyMatrix' [package "Matrix"] with 5 slots
      .. ..@ x       : logi NA
      .. ..@ Dim     : int [1:2] 1 1
      .. ..@ Dimnames:List of 2
      .. .. ..$ : NULL
      .. .. ..$ : NULL
      .. ..@ uplo    : chr "U"
      .. ..@ factors : list()
     $ d: int 4
    
    0 讨论(0)
提交回复
热议问题