2013-09-26 3 views
34

Как я могу удалить пустые элементы из списка, которые содержат нулевую длину pairlist как character(0), integer(0) и т.д. ...Удалить пустые элементы из списка с символом (0)

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

Я не знаю, как справиться с ними. Я имею в виду, если NULL намного проще. Как удалить эти элементы таким образом, чтобы в списке осталось только hsa:7476.

ответ

19

Один из возможных подходов:

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

+1, я всегда забыть о 'Фильтр'. Вы также можете сделать 'Filter (function (x)! Same (character (0), x), l)', если вы хотите проверить только против 'character (0)' – juba

+0

Что отличает этого, это позволяет подмножеству сделано в режиме онлайн! Для метода 'lengths' требуется наличие' l' в первую очередь для выполнения 'l [lengths (l)> 0]'. Я могу применить это в процессе создания моего подмножества. – MichaelChirico

22

Другой вариант (я думаю, что более эффективно), сохраняя индекс, где длина элемента> 0:

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

[[1]] 
[1] 1 2 3 

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

Использование lengths() для определения длины элементов списка:

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

Для полноты упаковки purrr м популярный tidyverse имеет ряд полезных функций для работы со списками - compact (introduction) делает трюк, тоже, и отлично работает с magrittr в %>% труб:

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

или

list(1:3, "foo", character(0), integer(0)) %>% compact 
Смежные вопросы