web-dev-qa-db-fra.com

Supprimer les éléments vides de la liste avec le caractère (0)

Comment puis-je supprimer des éléments vides d'une liste qui contiennent une paire de longueur nulle comme character(0), integer(0) etc ...

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

Je ne sais pas comment les gérer. Je veux dire que si NULL c'est beaucoup plus simple. Comment puis-je supprimer ces éléments de telle sorte que juste hsa:7476 reste dans la liste.

41
Richard A. Schäfer

Une autre option (je pense plus efficace) en gardant l'index où la longueur de l'élément> 0:

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

[[1]]
[1] 1 2 3

[[2]]
[1] "foo"
31
agstudy

Une approche possible est

Filter(length, l)
# [[1]]
# [1] 1 2 3
# 
# [[2]]
# [1] "foo"

l <- list(1:3, "foo", character(0), integer(0))

Cela fonctionne parce que les entiers positifs sont contraints à TRUE par Filter et, par conséquent, sont conservés, tandis que zéro ne le fait pas:

as.logical(0:2)
# [1] FALSE  TRUE  TRUE
26
Julius Vainora

Par souci d'exhaustivité, le paquet purrr du populaire tidyverse a quelques fonctions utiles pour travailler avec des listes - compact ( introduction =) fait aussi l'affaire et fonctionne très bien avec les tuyaux %>% de magrittr:

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

ou

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

Utilisez lengths() pour définir les longueurs des éléments de la liste:

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

Assez drôle, aucune des nombreuses solutions ci-dessus ne supprime la chaîne de caractères vide/vide: "". Mais la solution triviale n'est pas facile à trouver: L[L != ""].

Pour résumer, voici différentes manières de supprimer des éléments indésirables d'une liste de tableaux.

# Our Example List:
L <- list(1:3, "foo", "", character(0), integer(0))

# 1. Using the *purrr* package:
library(purrr)
compact(L)

# 2. Using the *Filter* function:
Filter(length, L)

# 3. Using *lengths* in a sub-array specification:
L[lengths(L) > 0]

# 4. Using *lapply* (with *length*) in a sub-array specification:
L[lapply(L,length)>0]

# 5. Using a sub-array specification:
L[L != ""]

# 6. Combine (3) & (5)
L[lengths(L) > 0 & L != ""]
4
not2qubit