2013-06-03 29 views
19

tôi có một danh sách như thế này:Extract yếu tố vô phi từ một danh sách trong 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 

và tôi muốn trích xuất tất cả các yếu tố mà không phải là null. Điều này có thể giải quyết như thế nào? Cảm ơn.

Trả lời

28

Dưới đây là một lựa chọn:

Filter(Negate(is.null), x) 
11

gì về:

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

Đây là một mô tả ngắn gọn về những gì đang xảy ra.

  1. lapply cho chúng ta mà yếu tố này là NULL

    R> lapply(x, is.null) 
    $a 
    [1] FALSE 
    
    $b 
    [1] FALSE 
    
    $c 
    [1] TRUE 
    
  2. Tiếp theo chúng ta convect danh sách vào một vector:

    R> unlist(lapply(x, is.null)) 
    a  b  c 
    FALSE FALSE TRUE 
    
  3. Sau đó chúng tôi chuyển TRUE-FALSE:

    R> !unlist(lapply(x, is.null)) 
        a  b  c 
    TRUE TRUE FALSE 
    
  4. Cuối cùng, chúng tôi chọn các yếu tố sử dụng các ký hiệu thông thường:

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

Sẽ không 'x [! Sapply (x, is.null)]' nhanh hơn? – Julius

0

đơn giản hơn và có khả năng nhanh hơn so với ở trên, các công việc sau cho các danh sách của bất kỳ giá trị không đệ quy nào (theo nghĩa là 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) in:

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

Bạn không cần tham chiếu đến hàm trong cơ sở và utils với 'base ::' và 'utils ::'. –

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

này khái quát cho bất kỳ tuyên bố logic về danh sách, chỉ phụ trong logic cho "is.null".

Các vấn đề liên quan