【问题标题】:Extract non null elements from a list in R从R中的列表中提取非空元素
【发布时间】:2013-05-29 13:58:45
【问题描述】:

我有一个这样的列表:

    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

我想提取所有不为空的元素。如何才能做到这一点?谢谢。

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    这是另一个选择:

    Filter(Negate(is.null), x)
    

    【讨论】:

      【解决方案2】:

      怎么样:

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

      【讨论】:

      • x[!sapply(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
          .. ..@ x       : logi NA
          .. ..@ Dim     : int [1:2] 1 1
          .. ..@ Dimnames:List of 2
          .. .. ..$ : NULL
          .. .. ..$ : NULL
          .. ..@ uplo    : chr "U"
          .. ..@ factors : list()
         $ d: int 4
        

        【讨论】:

        • 你不需要用base::utils::来引用base和utils中的函数。
        猜你喜欢
        • 2019-12-29
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多