Ich habe eine Liste und möchte ein einzelnes Element daraus entfernen. Wie kann ich das machen?
Ich habe versucht, nachzuschlagen, was meiner Meinung nach die naheliegendsten Namen für diese Funktion im Referenzhandbuch sind, und ich habe nichts passendes gefunden.
Ich kenne R überhaupt nicht, aber ein bisschen kreatives Googeln hat mich hierher geführt: http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html
Das Schlüsselzitat von dort:
Ich finde keine explizite Dokumentation für R, wie Elemente aus Listen entfernt werden, aber Trial and Error sagt mir
myList [[5]] <- NULL
entfernt das fünfte Element und "schließt" dann das Loch, das durch das Löschen dieses Elements verursacht wurde. Das durchdringt die Indexwerte. Ich muss also beim Ablegen von Elementen vorsichtig sein. Ich muss von der Rückseite der Liste nach vorne arbeiten.
Eine Antwort auf diesen Beitrag später im Thread heißt:
Um ein Element einer Liste zu löschen, siehe R FAQ 7.1
Und der relevante Abschnitt des R FAQ sagt:
... Setzen Sie x [i] oder x [[i]] nicht auf NULL, da dadurch die entsprechende Komponente aus der Liste entfernt wird.
Was scheint Ihnen (etwas rückwärts) zu sagen, wie man ein Element entfernt.
Hoffen Sie, dass das hilft oder zumindest in die richtige Richtung führt.
Wenn Sie die Liste nicht direkt ändern möchten (z. B. zum Übergeben der Liste mit entferntem Element an eine Funktion), können Sie die Indizierung verwenden: Negative Indizes bedeuten "dieses Element nicht einschließen".
x <- list("a", "b", "c", "d", "e"); # example list
x[-2]; # without 2nd element
x[-c(2, 3)]; # without 2nd and 3rd
Logische Indexvektoren sind auch nützlich:
x[x != "b"]; # without elements that are "b"
Dies funktioniert auch mit Datenrahmen:
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
So entfernen Sie das letzte Element einer list in R:
x <- list("a", "b", "c", "d", "e")
x[length(x)] <- NULL
Wenn x ein Vektor sein könnte, müssten Sie ein neues Objekt erstellen:
x <- c("a", "b", "c", "d", "e")
x <- x[-length(x)]
Entfernen von Null-Elementen aus einer Liste in einer Zeile:
x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]
Prost
Wenn Sie eine benannte Liste haben und ein bestimmtes Element entfernen möchten, können Sie Folgendes versuchen:
lst <- list(a = 1:4, b = 4:8, c = 8:10)
if("b" %in% names(lst)) lst <- lst[ - which(names(lst) == "b")]
Dadurch wird eine Liste lst
mit den Elementen a
, b
, c
erstellt. Die zweite Zeile entfernt das Element b
, nachdem es überprüft hat, dass es existiert (um das erwähnte Problem @hjv zu vermeiden).
oder besser:
lst$b <- NULL
Auf diese Weise ist es kein Problem, zu versuchen, ein nicht vorhandenes Element zu löschen (z. B. lst$g <- NULL
).
Das rlist-Paket ( http://cran.r-project.org/web/packages/rlist/index.html ) enthält verschiedene Arten von Listenoperationen.
Beispiel ( 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"))
Ergebnisse in:
# $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
Ich weiß nicht, ob Sie noch eine Antwort darauf brauchen, aber ich habe aus meiner begrenzten (3 Wochen lang selbstlernenden R) Erfahrung mit R herausgefunden, dass die Verwendung der NULL
-Zuordnung tatsächlich falsch oder nicht optimal ist, insbesondere wenn Sie dynamisch sind Aktualisieren einer Liste in etwa einer for-Schleife.
Genauer gesagt mit
myList[[5]] <- NULL
wird den Fehler werfen
myList [[5]] <- NULL: Ersetzung hat Länge Null
oder
mehr Elemente geliefert als zu ersetzen sind
Was ich konsequenter gefunden habe, ist
myList <- myList[[-5]]
Ich möchte hinzufügen, dass es sich um eine benannte Liste handelt Sie können einfach within
verwenden.
l <- list(a = 1, b = 2)
> within(l, rm(a))
$b
[1] 2
So können Sie die ursprüngliche Liste überschreiben
l <- within(l, rm(a))
um das Element a
aus der Liste l
zu entfernen.
Verwenden Sie -
(Negatives Zeichen) zusammen mit der Position des Elements. Beispiel, wenn das dritte Element entfernt werden soll, verwenden Sie es als your_list[-3]
Eingabe
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
Einzelne Elemente aus der Liste entfernen
my_list[-3]
# $`a`
# [1] 3
# $b
# [1] 3
# $d
# [1] "Hello"
# $e
[1] NA
Mehrere Elemente aus der Liste entfernen
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
Ich wollte nur schnell hinzufügen (weil ich in keiner der Antworten gesehen habe), dass Sie für eine benannte Liste auch l["name"] <- NULL
tun können. Zum Beispiel:
l <- list(a = 1, b = 2, cc = 3)
l['b'] <- NULL
Bei benannten Listen finde ich diese Hilfsfunktionen nützlich
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
Lapply und Grep verwenden:
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))]
wenn Sie numerische Indizes vermeiden möchten, können Sie verwenden
a <- setdiff(names(a),c("name1", ..., "namen"))
namen namea...namen
von a löschen. das funktioniert für Listen
> l <- list(a=1,b=2)
> l[setdiff(names(l),"a")]
$b
[1] 2
sowie für Vektoren
> v <- c(a=1,b=2)
> v[setdiff(names(v),"a")]
b
2