web-dev-qa-db-fra.com

Comment puis-je supprimer un élément d'une liste?

J'ai une liste et je veux en retirer un seul élément. Comment puis-je faire ceci?

J'ai essayé de rechercher ce que je pense que les noms évidents pour cette fonction seraient dans le manuel de référence et je n'ai rien trouvé de approprié.

219
David Locke

Je ne sais pas du tout R, mais un peu de google créatif m'a conduit ici:  http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html

La citation clé à partir de là:

Je ne trouve pas de documentation explicite pour R sur la façon de supprimer des éléments de listes, mais des essais et des erreurs me disent

maListe [[5]] <- NULL

supprime le 5ème élément puis "ferme" le trou causé par la suppression de cet élément. Cela supprime les valeurs d'index. Je dois donc faire attention en supprimant des éléments. Je dois travailler à partir du dos de la liste.

A réponse à cette publication plus tard dans le fil de discussion déclare:

Pour supprimer un élément d'une liste, voir R FAQ 7.1

Et la section pertinente de la R FAQ dit:

... Ne définissez pas x [i] ou x [[i]] sur NULL, car le composant correspondant sera supprimé de la liste. 

Ce qui semble vous dire (de manière quelque peu rétrograde) comment supprimer un élément.

J'espère que cela vous aidera, ou du moins vous mènera dans la bonne direction.

182
Chad Birch

Si vous ne souhaitez pas modifier la liste sur place (par exemple, pour passer la liste avec un élément supprimé à une fonction), vous pouvez utiliser l'indexation: les indices négatifs signifient "ne pas inclure cet élément".

x <- list("a", "b", "c", "d", "e"); # example list

x[-2];       # without 2nd element

x[-c(2, 3)]; # without 2nd and 3rd

De plus, les vecteurs d'index logique sont utiles:

x[x != "b"]; # without elements that are "b"

Cela fonctionne aussi avec les cadres de données:

df <- data.frame(number = 1:5, name = letters[1:5])

df[df$name != "b", ];     # rows without "b"

df[df$number %% 2 == 1, ] # rows with odd numbers only
175
Florian Jenn

Voici comment supprimer le dernier élément d'un list dans R:

x <- list("a", "b", "c", "d", "e")
x[length(x)] <- NULL

Si x peut être un vecteur, vous devez créer un nouvel objet:

x <- c("a", "b", "c", "d", "e")
x <- x[-length(x)]
  • Travailler pour lists et vectors
29
Aleksandr Levchuk

Supprimer des éléments Null d'une liste en une seule ligne:

x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]

À votre santé

17
Sukhdeep Singh

Si vous avez une liste nommée et souhaitez supprimer un élément spécifique, vous pouvez essayer:

lst <- list(a = 1:4, b = 4:8, c = 8:10)

if("b" %in% names(lst)) lst <- lst[ - which(names(lst) == "b")]

Cela créera une liste lst avec des éléments a, b, c. La deuxième ligne supprime l'élément b après avoir vérifié son existence (pour éviter le problème @hjv mentionné).

ou mieux:

lst$b <- NULL

De cette manière, essayer de supprimer un élément inexistant (par exemple lst$g <- NULL) ne pose pas de problème.

13
alko989

Il y a le paquetage rlist ( http://cran.r-project.org/web/packages/rlist/index.html ) pour traiter divers types d’opérations de liste.

Exemple ( http://cran.r-project.org/web/packages/rlist/vignettes/Filtering.html ):

library(rlist)
devs <- 
  list(
    p1=list(name="Ken",age=24,
      interest=c("reading","music","movies"),
      lang=list(r=2,csharp=4,python=3)),
    p2=list(name="James",age=25,
      interest=c("sports","music"),
      lang=list(r=3,Java=2,cpp=5)),
    p3=list(name="Penny",age=24,
      interest=c("movies","reading"),
      lang=list(r=1,cpp=4,python=2)))

list.remove(devs, c("p1","p2"))

Résulte en:

# $p3
# $p3$name
# [1] "Penny"
# 
# $p3$age
# [1] 24
# 
# $p3$interest
# [1] "movies"  "reading"
# 
# $p3$lang
# $p3$lang$r
# [1] 1
# 
# $p3$lang$cpp
# [1] 4
# 
# $p3$lang$python
# [1] 2
7
user2030503

Je ne sais pas si vous avez toujours besoin d'une réponse, mais d'après mon expérience limitée de R (3 semaines d'auto-apprentissage) avec R, utiliser l'attribution NULL est en réalité incorrect ou sous-optimal, en particulier si vous êtes dynamique. mettre à jour une liste dans quelque chose comme une boucle for.

Pour être plus précis, en utilisant

myList[[5]] <- NULL

va jeter l'erreur

myList [[5]] <- NULL: le remplacement a la longueur zéro

ou

plus d'éléments fournis qu'il n'y a à remplacer

Ce que j’ai trouvé fonctionner plus régulièrement, c’est

myList <- myList[[-5]]
6
user2035799

J'aimerais ajouter que s'il s'agit d'une liste de named, vous pouvez simplement utiliser within

l <- list(a = 1, b = 2)    
> within(l, rm(a))
$b
[1] 2

Vous pouvez donc écraser la liste d'origine

l <- within(l, rm(a)) 

supprimer un élément nommé a de la liste l

4
Kim

Utilisez - (signe négatif) avec la position de l'élément. Par exemple, si le 3ème élément doit être supprimé, utilisez-le en tant que your_list[-3]

Contribution  

my_list <- list(a = 3, b = 3, c = 4, d = "Hello", e = NA)
my_list
# $`a`
# [1] 3

# $b
# [1] 3

# $c
# [1] 4

# $d
# [1] "Hello"

# $e
# [1] NA

Supprimer un seul élément de la liste

 my_list[-3]
 # $`a`
 # [1] 3

 # $b
 # [1] 3

 # $d
 # [1] "Hello"

 # $e
 [1] NA

Supprimer plusieurs éléments de la liste

 my_list[c(-1,-3,-2)]
 # $`d`
 # [1] "Hello"

 # $e
 # [1] NA

 my_list[c(-3:-5)]
 # $`a`
 # [1] 3

 # $b
 # [1] 3

 my_list[-seq(1:2)]
 # $`c`
 # [1] 4

 # $d
 # [1] "Hello"

 # $e
 # [1] NA
2
Sowmya S. Manian

Je voulais juste ajouter rapidement (parce que je ne l'ai pas vu dans aucune des réponses) que, pour une liste nommée, vous pouvez aussi faire l["name"] <- NULL. Par exemple:

l <- list(a = 1, b = 2, cc = 3)
l['b'] <- NULL
2
Alexey Shiklomanov

Dans le cas des listes nommées, je trouve ces fonctions utiles utiles

member <- function(list,names){
    ## return the elements of the list with the input names
    member..names <- names(list)
    index <- which(member..names %in% names)
    list[index]    
}


exclude <- function(list,names){
     ## return the elements of the list not belonging to names
     member..names <- names(list)
     index <- which(!(member..names %in% names))
    list[index]    
}  
aa <- structure(list(a = 1:10, b = 4:5, fruits = c("Apple", "orange"
)), .Names = c("a", "b", "fruits"))

> aa
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10

## $b
## [1] 4 5

## $fruits
## [1] "Apple"  "orange"


> member(aa,"fruits")
## $fruits
## [1] "Apple"  "orange"


> exclude(aa,"fruits")
## $a
##  [1]  1  2  3  4  5  6  7  8  9 10

## $b
## [1] 4 5
1
DJJ

En utilisant lapply et grep:

lst <- list(a = 1:4, b = 4:8, c = 8:10)
# say you want to remove a and c
toremove<-c("a","c")
lstnew<-lst[-unlist(lapply(toremove, function(x) grep(x, names(lst)) ) ) ]
#or
pattern<-"a|c"
lstnew<-lst[-grep(pattern, names(lst))]
0
Ferroao

si vous souhaitez éviter les index numériques, vous pouvez utiliser

a <- setdiff(names(a),c("name1", ..., "namen"))

supprimer des noms namea...namen de a. cela fonctionne pour les listes

> l <- list(a=1,b=2)
> l[setdiff(names(l),"a")]
$b
[1] 2

ainsi que pour les vecteurs

> v <- c(a=1,b=2)
> v[setdiff(names(v),"a")]
b 
2
0
Greg Minshall