从R中的列表中提取非null元素

时间:2013-06-03 12:08:28

标签: r data-manipulation

我有一个这样的清单:

    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

我希望提取所有非空元素。如何才能做到这一点?感谢。

4 个答案:

答案 0 :(得分:34)

这是另一种选择:

Filter(Negate(is.null), x)

答案 1 :(得分:11)

怎么样:

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

以下是对正在发生的事情的简要说明。

  1. lapply告诉我们哪些元素是NULL

    R> lapply(x, is.null)
    $a
    [1] FALSE
    
    $b
    [1] FALSE
    
    $c
    [1] TRUE
    
  2. 接下来,我们将列表转换为向量:

    R> unlist(lapply(x, is.null)) 
    a     b     c 
    FALSE FALSE  TRUE 
    
  3. 然后我们将TRUE切换为FALSE

    R> !unlist(lapply(x, is.null))
        a     b     c 
    TRUE  TRUE FALSE 
    
  4. 最后,我们使用通常的表示法选择元素:

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

答案 2 :(得分:3)

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

这概括为关于列表的任何逻辑语句,只是“is.null”逻辑中的子语句。

答案 3 :(得分:0)

比上述更简单且更快,以下适用于任何非递归(在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
  .. ..@ x       : logi NA
  .. ..@ Dim     : int [1:2] 1 1
  .. ..@ Dimnames:List of 2
  .. .. ..$ : NULL
  .. .. ..$ : NULL
  .. ..@ uplo    : chr "U"
  .. ..@ factors : list()
 $ d: int 4