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é.
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.
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
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)]
Supprimer des éléments Null d'une liste en une seule ligne:
x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]
À votre santé
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.
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
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]]
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
.
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
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
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
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))]
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