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.
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"
Une approche possible est
Filter(length, l)
# [[1]]
# [1] 1 2 3
#
# [[2]]
# [1] "foo"
où
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
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
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"
#>
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 != ""]