web-dev-qa-db-ja.com

Rのリストからnull以外の要素を抽出する

私はこのようなリストを持っています:

    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

そして、私はnullでないすべての要素を抽出したいと思います。これはどのように行うことができますか?ありがとう。

30
qed

ここに別のオプションがあります:

Filter(Negate(is.null), x)
38
Matthew Plourde

何について:

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))]
    
12
csgillespie
x[!sapply(x,is.null)]

これは、 "is.null"のロジックのsubである、リストに関するすべての論理ステートメントに一般化されます。

5
ColinTea

上記よりも単純で、おそらく高速です。以下は、再帰的でない(_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
_
0
Sander