it-swarm.com.de

Wie kann ich ein Element aus einer Liste entfernen?

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.

219
David Locke

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.

182
Chad Birch

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
175
Florian Jenn

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)]
  • Arbeiten für Listen und Vektoren
29

Entfernen von Null-Elementen aus einer Liste in einer Zeile:

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

Prost

17
Sukhdeep Singh

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).

13
alko989

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
7
user2030503

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]]
6
user2035799

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. 

4
Kim

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
2

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
2

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
1
DJJ

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))]
0
Ferroao

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
0
Greg Minshall