2013-09-26 12 views
34

Wie kann ich leere Elemente aus einer Liste zu entfernen, die Null-Länge pairlist als character(0), integer(0) usw. enthalten ...entfernen leere Elemente aus der Liste mit Charakter (0)

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

Ich weiß nicht, wie man mit ihnen umgehen. Ich meine, wenn NULL es viel einfacher ist. Wie kann ich diese Elemente entfernen, so dass nur hsa:7476 in der Liste bleibt.

Antwort

19

Ein möglicher Ansatz:

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

+1, habe ich immer Vergessen Sie 'Filter'. Sie können auch 'Filter (function (x)! Identical (character (0), x), l)' wenn Sie nur gegen 'character (0)' – juba

+0

überprüfen wollen, was großartig ist, ist es erlaubt die Teilmenge zu sein in-line gemacht! Der "Längen" -Ansatz erfordert, an erster Stelle ein "l" zu haben, um "l [längen (l)> 0]" zu machen. Ich kann dies beim Erstellen meiner Teilmenge anwenden. – MichaelChirico

22

Eine weitere Option (ich glaube, effizient) durch den Index zu halten, wo Elementlänge> 0:

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

[[1]] 
[1] 1 2 3 

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

Verwenden lengths() Längen der Listenelemente zu definieren:

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

Der Vollständigkeit halber ist das purrr Paket von m die beliebte tidyverse einige nützliche Funktionen für die Arbeit mit Listen hat - compact (introduction) den Trick funktioniert auch, und arbeitet mit magrittr der %>% Rohre fein:

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

oder

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