2013-06-03 42 views
19

我有一個這樣的名單:提取非空元素中的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 

,我想提取不爲空的所有元素。如何才能做到這一點?謝謝。

回答

28

這裏的另一種選擇:

Filter(Negate(is.null), x) 
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. 然後我們切換TRUEFALSE

    R> !unlist(lapply(x, is.null)) 
        a  b  c 
    TRUE TRUE FALSE 
    
  4. 最後,我們選擇使用普通的符號元素:

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

'x [!sapply(x,is.null)]'會更快嗎? – Julius

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 
    .. [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 
+0

你不需要用'base ::'和'utils ::'來引用base和utils中的函數。 –

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

這可以推廣到對列表中的任何邏輯語句,只需在邏輯子爲 「is.null」。