Zależy, czy chcesz go usunąć według wartości, np. „Wartości 5”, czy według indeksu / indeksów, „elementu o indeksie 5” czy „w indeksach c (5: 6,10)? Jeśli chcesz usunąć według wartości i tam są duplikaty, to czy chcesz usunąć tylko duplikaty, pierwsze lub ostatnie wystąpienie, czy wszystkie? Czy to gwarantuje, że lista zawiera Twój element / indeks? Czy musimy obsługiwać przypadek, w którym lista jest pusta? Czy musimy upewnić się, że NA został zaliczony (/ wykluczony)? Czy lista jest płaska czy może być zagnieżdżona? Ile głębokości później?
Nie znajduję wyraźnej dokumentacji dla R na temat usuwania elementów z list, ale próby i błędy mówią mi
myList [[5]] <- NULL
usunie piąty element, a następnie „zamknie” dziurę spowodowaną usunięciem tego elementu. To wyczerpuje wartości indeksu, więc muszę uważać na upuszczanie elementów. Muszę pracować od końca listy do przodu.
Dzięki, mylist [i] <- NULL jest właśnie tym sposobem.
David Locke
37
To nie działało dla mnie. Dostaję:Error in list[length(list)] <- NULL : replacement has length zero
wfbarksdale
3
W poście @Aleksandr Levchuck pokazałem, że faktycznie mam do czynienia z wektorem i muszę stworzyć nowy obiekt
wfbarksdale,
209
Jeśli nie chcesz modyfikować listy w miejscu (np. Do przekazywania listy z elementem usuniętym do funkcji), możesz użyć indeksowania: ujemne wskaźniki oznaczają „nie uwzględniaj tego elementu”.
x <- list("a","b","c","d","e");# example list
x[-2];# without 2nd element
x[-c(2,3)];# without 2nd and 3rd
Przydatne są również wektory indeksu logicznego:
x[x !="b"];# without elements that are "b"
Działa to również z ramkami danych:
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
Twój indeks logiczny działa tylko wtedy, gdy masz ten pojedynczy element „b” w elemencie listy. Nie można usunąć, powiedzmy w x$bten sposób, ani nie można usunąć „b” z elementu listy x[[2]] = c("b","k") .
Carl Witthoft
Odnośnie pojedynczych lub wielu przedmiotów: możesz użyć %in%do testowania wielu przedmiotów. Nie jestem pewien, co rozumiesz przez „nie można usunąć x $ b” - czy masz na myśli usunięcie całej kolumny b?
Florian Jenn,
30
Oto jak usunąć ostatni element listy w R:
x <- list("a","b","c","d","e")
x[length(x)]<-NULL
Jeśli x może być wektorem, musisz utworzyć nowy obiekt:
Ten kod pęka, gdy xjest pusta lista. Zamiast tego użyj compactz plyrtego zadania.
Richie Cotton
Również, jeśli na liście nie ma wartości null, -(which(sapply(x,is.null),arr.ind=TRUE))zwraca, named integer(0)co spowoduje całkowite usunięcie tego wiersza.
user3055034
17
Chciałbym dodać, że jeśli jest to nazwana lista, której możesz po prostu użyć within.
jak można usunąć elementy python lub lang w tym przykładzie?
Arthur Yip,
9
Nie wiem, czy nadal potrzebujesz odpowiedzi na to pytanie, ale z mojego ograniczonego (3-tygodniowego samouczenia R) doświadczenia z R wynika, że użycie NULLzadania jest w rzeczywistości złe lub nieoptymalne, szczególnie jeśli dynamicznie aktualizujesz lista w czymś w rodzaju pętli for.
Dobra odpowiedź! Myślę jednak, że [[-5]]powinny to być pojedyncze nawiasy kwadratowe, w przeciwnym razie odznaczasz tylko zawartość tego elementu listy, a nie sam element. Cóż, przynajmniej użycie podwójnych nawiasów kwadratowych daje mi ten błąd: „spróbuj wybrać więcej niż jeden element”. Co działa na mnie wtedy: myList <- myList[-5].
n1k31t4
4
Chciałem tylko szybko dodać (bo nie widziałem tego w żadnej z odpowiedzi), że dla nazwanej listy możesz to zrobić l["name"] <- NULL. Na przykład:
W przypadku list nazwanych przydatne są te funkcje pomocnicze
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
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))]
Odpowiedzi:
W ogóle nie znam R., ale doprowadziło mnie tutaj trochę kreatywnego googlingu: http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html
Kluczowy cytat stamtąd:
Odpowiedź na to stanowisko później w wątku stanów:
Oraz odpowiedniej części R FAQ mówi:
Co wydaje się mówić (nieco do tyłu), jak usunąć element.
Nadzieja, która pomaga, a przynajmniej prowadzi cię we właściwym kierunku.
źródło
Error in list[length(list)] <- NULL : replacement has length zero
Jeśli nie chcesz modyfikować listy w miejscu (np. Do przekazywania listy z elementem usuniętym do funkcji), możesz użyć indeksowania: ujemne wskaźniki oznaczają „nie uwzględniaj tego elementu”.
Przydatne są również wektory indeksu logicznego:
Działa to również z ramkami danych:
źródło
x$b
ten sposób, ani nie można usunąć „b” z elementu listyx[[2]] = c("b","k")
.%in%
do testowania wielu przedmiotów. Nie jestem pewien, co rozumiesz przez „nie można usunąć x $ b” - czy masz na myśli usunięcie całej kolumnyb
?Oto jak usunąć ostatni element listy w R:
Jeśli x może być wektorem, musisz utworzyć nowy obiekt:
źródło
Usuwanie elementów Null z listy w jednym wierszu:
x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]
Twoje zdrowie
źródło
x
jest pusta lista. Zamiast tego użyjcompact
zplyr
tego zadania.-(which(sapply(x,is.null),arr.ind=TRUE))
zwraca,named integer(0)
co spowoduje całkowite usunięcie tego wiersza.Chciałbym dodać, że jeśli jest to nazwana lista, której możesz po prostu użyć
within
.Możesz więc zastąpić oryginalną listę
aby usunąć element o nazwie
a
z listyl
.źródło
within(l, rm(a, b))
Jeśli masz nazwaną listę i chcesz usunąć określony element, możesz spróbować:
Będzie to zrobić listę
lst
z elementamia
,b
,c
. Druga linia usuwa elementb
po sprawdzeniu, że istnieje (aby uniknąć wspomnianego problemu @hjv).albo lepiej:
W ten sposób nie jest problemem próba usunięcia nieistniejącego elementu (np.
lst$g <- NULL
)źródło
Istnieje pakiet rlist ( http://cran.r-project.org/web/packages/rlist/index.html ) do obsługi różnego rodzaju operacji na listach.
Przykład ( http://cran.r-project.org/web/packages/rlist/vignettes/Filtering.html ):
Prowadzi do:
źródło
Nie wiem, czy nadal potrzebujesz odpowiedzi na to pytanie, ale z mojego ograniczonego (3-tygodniowego samouczenia R) doświadczenia z R wynika, że użycie
NULL
zadania jest w rzeczywistości złe lub nieoptymalne, szczególnie jeśli dynamicznie aktualizujesz lista w czymś w rodzaju pętli for.Aby być bardziej precyzyjnym, używając
wyrzuci błąd
lub
Stwierdziłem, że działa bardziej konsekwentnie
źródło
[[-5]]
powinny to być pojedyncze nawiasy kwadratowe, w przeciwnym razie odznaczasz tylko zawartość tego elementu listy, a nie sam element. Cóż, przynajmniej użycie podwójnych nawiasów kwadratowych daje mi ten błąd: „spróbuj wybrać więcej niż jeden element”. Co działa na mnie wtedy:myList <- myList[-5]
.Chciałem tylko szybko dodać (bo nie widziałem tego w żadnej z odpowiedzi), że dla nazwanej listy możesz to zrobić
l["name"] <- NULL
. Na przykład:źródło
Użyj
-
(znak ujemny) wraz z pozycją elementu, na przykład jeśli trzeci element ma zostać usunięty, użyj go jakoyour_list[-3]
Wejście
Usuń pojedynczy element z listy
Usuń wiele elementów z listy
źródło
W przypadku list nazwanych przydatne są te funkcje pomocnicze
źródło
Używanie lapply i grep:
źródło
Co powiesz na to? Ponownie, używając indeksów
lub
źródło
m[1:(length(m) - 1)]
jeśli chcesz uniknąć indeksów numerycznych, możesz użyć
aby usunąć nazwy
namea...namen
z. to działa w przypadku listjak również dla wektorów
źródło
Możesz użyć
which
.źródło
list