2013-09-26 31 views
34

Jak usunąć puste elementy z listy, które zawierają zerowej długości pairlist jako character(0), integer(0) etc ...Usuń puste elementy z listy z charakterem (0)

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

nie wiem jak radzić sobie z nimi. Mam na myśli, że jeśli NULL jest o wiele prostsze. Jak mogę usunąć te elementy tak, aby tylko hsa:7476 pozostało na liście.

Odpowiedz

19

Jednym z możliwych podejście:

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

+1, zawsze zapomnij o "Filtrze". Możesz także zrobić "Filtr (funkcja (x)! Identyczny (znak (0), x), l)", jeśli chcesz sprawdzić tylko przed znakiem '(0)' – juba

+0

Co jest w tym świetne, to pozwala na podzbiór Sporządzono w linii! Podejście "lengths" wymaga, aby 'l' w pierwszej kolejności zawierało' l [lengths (l)> 0] '. Mogę to zastosować w procesie tworzenia mojego podzbioru. – MichaelChirico

22

Inną opcją (myślę, że bardziej wydajne) utrzymując wskaźnik gdzie długość element> 0:

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

[[1]] 
[1] 1 2 3 

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

Zastosowanie lengths() zdefiniowanie długości elementów listy:

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

Ze względu na kompletność, pakiet purrr od m popularny tidyverse ma kilka przydatnych funkcji do pracy z listami - compact (introduction) załatwia sprawę, także i współpracuje z magrittr za %>% rur:

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

lub

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