2013-09-26 102 views
34

Làm thế nào tôi có thể loại bỏ yếu tố rỗng từ một danh sách có chứa số không dài pairlist như character(0), integer(0) vv ...Hủy bỏ các yếu tố có sản phẩm nào trong danh sách với ký tự (0)

list2 
# $`hsa:7476` 
# [1] "1","2","3" 
# 
# $`hsa:656` 
# character(0) 
# 
# $`hsa:7475` 
# character(0) 
# 
# $`hsa:7472` 
# character(0) 

Tôi không biết làm thế nào để đối phó với họ. Ý tôi là nếu NULL thì đơn giản hơn nhiều. Làm thế nào tôi có thể loại bỏ các yếu tố này mà chỉ cần hsa:7476 vẫn còn trong danh sách.

Trả lời

19

Một cách tiếp cận có thể:

l <- list(1:3, "foo", character(0), integer(0)) 
Filter(length, l) 
# [[1]] 
# [1] 1 2 3 
# 
# [[2]] 
# [1] "foo" 
+2

+1, tôi luôn quên đi 'Lọc'. Bạn cũng có thể làm 'Filter (function (x)! Giống hệt nhau (ký tự (0), x), l)' nếu bạn chỉ muốn kiểm tra 'character (0)' – juba

+0

Điều tuyệt vời ở đây là nó cho phép tập hợp con thực hiện trực tuyến! Cách tiếp cận 'lengths' đòi hỏi phải có' l' ở vị trí đầu tiên để làm 'l [lengths (l)> 0]'. Tôi có thể áp dụng điều này trong quá trình tạo tập hợp con của tôi. – MichaelChirico

22

Một tùy chọn khác (tôi nghĩ hiệu quả hơn) bằng cách giữ cho chỉ số nơi chiều dài element> 0:

l[lapply(l,length)>0] ## you can use sapply,rapply 

[[1]] 
[1] 1 2 3 

[[2]] 
[1] "foo" 
8

Sử dụng lengths() để xác định độ dài của các yếu tố danh sách:

l <- list(1:3, "foo", character(0), integer(0)) 
l[lengths(l) > 0L] 
#> [[1]] 
#> [1] 1 2 3 
#> 
#> [[2]] 
#> [1] "foo" 
#> 
4

Vì mục đích hoàn chỉnh, gói purrr fro m phổ biến tidyverse có một số chức năng hữu ích để làm việc với danh sách - compact (introduction) không lừa, quá, và hoạt động tốt với magrittr của %>% ống:

l <- list(1:3, "foo", character(0), integer(0)) 
library(purrr) 
compact(l) 
# [[1]] 
# [1] 1 2 3 
# 
# [[2]] 
# [1] "foo" 

hoặc

list(1:3, "foo", character(0), integer(0)) %>% compact