Depende de si desea eliminarlo por valor, por ejemplo, "el valor 5", o por índice / índices "el elemento en el índice 5" o "en los índices c (5: 6,10)? Si desea eliminar por valor y allí son duplicados, entonces ¿desea eliminar solo los duplicados, la primera o la última aparición, o todos? ¿Se garantiza que la lista contiene su elemento / índice? ¿Necesitamos manejar el caso donde la lista está vacía? ¿Necesitamos se pasa a asegurar NA (/ excluido) es la lista garantiza que sea plana o puede estar anidada ¿Cuántas los laters profunda???
No encuentro documentación explícita para R sobre cómo eliminar elementos de las listas, pero la prueba y el error me dicen
myList [[5]] <- NULL
eliminará el quinto elemento y luego "cerrará" el agujero causado por la eliminación de ese elemento. Eso sufre los valores del índice, así que tengo que tener cuidado al soltar elementos. Debo trabajar desde el final de la lista hasta el frente.
Gracias, mylist [i] <- NULL es exactamente la forma de hacerlo.
David Locke
37
Esto no funcionó para mí. Obtengo:Error in list[length(list)] <- NULL : replacement has length zero
wfbarksdale
3
La publicación de @Aleksandr Levchuck me mostró que en realidad estaba lidiando con un vector y que necesitaba crear un nuevo objeto
wfbarksdale
209
Si no desea modificar la lista en el lugar (por ejemplo, para pasar la lista con un elemento eliminado a una función), puede usar la indexación: los índices negativos significan "no incluir este elemento".
x <- list("a","b","c","d","e");# example list
x[-2];# without 2nd element
x[-c(2,3)];# without 2nd and 3rd
Además, los vectores de índice lógicos son útiles:
x[x !="b"];# without elements that are "b"
Esto también funciona con marcos de datos:
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
Su índice lógico solo funciona si tiene ese único elemento "b" en un elemento de la lista. No puede eliminar, por ejemplo, de x$besa manera, ni puede eliminar "b" de un elemento de la lista x[[2]] = c("b","k") .
Carl Witthoft
Con respecto a los elementos individuales versus múltiples: puede usar %in%para probar contra múltiples elementos. No estoy seguro de lo que quieres decir con "no se puede eliminar x $ b". ¿Quieres decir eliminar toda la columna b?
Florian Jenn
30
Así es como se elimina el último elemento de una lista en R:
x <- list("a","b","c","d","e")
x[length(x)]<-NULL
Si x podría ser un vector, entonces necesitaría crear un nuevo objeto:
Si tiene una lista con nombre y desea eliminar un elemento específico, puede intentar:
lst <- list(a =1:4, b =4:8, c =8:10)if("b"%in% names(lst)) lst <- lst[- which(names(lst)=="b")]
Esto hará una lista lstcon los elementos a, b, c. La segunda línea elimina el elemento bdespués de comprobar que existe (para evitar el problema mencionado por @hjv).
o mejor:
lst$b <-NULL
De esta manera, no es un problema intentar eliminar un elemento inexistente (por ejemplo lst$g <- NULL)
¿Cómo se pueden eliminar los elementos de Python o Lang en este ejemplo?
Arthur Yip
9
No sé si aún necesita una respuesta a esto, pero descubrí por mi experiencia limitada (3 semanas de autoaprendizaje R) con R que, el uso de la NULLtarea es realmente incorrecto o subóptimo, especialmente si está actualizando dinámicamente una lista en algo así como un bucle for.
Para ser más precisos, usando
myList[[5]]<-NULL
arrojará el error
myList [[5]] <- NULL: el reemplazo tiene longitud cero
o
más elementos suministrados de los que hay que reemplazar
Lo que encontré para trabajar más consistentemente es
¡Buena respuesta! Sin embargo, creo que [[-5]]deberían estar entre corchetes, de lo contrario, estará deseleccionando solo el contenido de ese elemento de la lista, no el elemento en sí. Bueno, al menos usar corchetes dobles me da este error: "intento de seleccionar más de un elemento". Lo que funciona para mí fue entonces: myList <- myList[-5].
n1k31t4
4
Solo quería agregar rápidamente (porque no lo vi en ninguna de las respuestas) que, para una lista con nombre, también puede hacer l["name"] <- NULL. Por ejemplo:
En el caso de las listas con nombre, encuentro útiles esas funciones auxiliares
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))]
Respuestas:
No sé R en absoluto, pero un poco de búsqueda creativa en Google me llevó aquí: http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html
La cita clave a partir de ahí:
Una respuesta a esa publicación más adelante en el hilo dice:
Y la sección relevante de las preguntas frecuentes de R dice:
Lo que parece decirle (de una manera un tanto al revés) cómo eliminar un elemento.
Espero que ayude, o al menos lo guíe en la dirección correcta.
fuente
Error in list[length(list)] <- NULL : replacement has length zero
Si no desea modificar la lista en el lugar (por ejemplo, para pasar la lista con un elemento eliminado a una función), puede usar la indexación: los índices negativos significan "no incluir este elemento".
Además, los vectores de índice lógicos son útiles:
Esto también funciona con marcos de datos:
fuente
x$b
esa manera, ni puede eliminar "b" de un elemento de la listax[[2]] = c("b","k")
.%in%
para probar contra múltiples elementos. No estoy seguro de lo que quieres decir con "no se puede eliminar x $ b". ¿Quieres decir eliminar toda la columnab
?Así es como se elimina el último elemento de una lista en R:
Si x podría ser un vector, entonces necesitaría crear un nuevo objeto:
fuente
Eliminar elementos nulos de una lista en una sola línea:
x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]
Salud
fuente
x
es una lista vacía. Utilicecompact
fromplyr
para esta tarea en su lugar.-(which(sapply(x,is.null),arr.ind=TRUE))
retornosnamed integer(0)
que eliminarán esa fila por completo.Me gustaría agregar que si se trata de una lista con nombre , simplemente puede usar
within
.Para que pueda sobrescribir la lista original
para eliminar el elemento nombrado
a
de la listal
.fuente
within(l, rm(a, b))
Si tiene una lista con nombre y desea eliminar un elemento específico, puede intentar:
Esto hará una lista
lst
con los elementosa
,b
,c
. La segunda línea elimina el elementob
después de comprobar que existe (para evitar el problema mencionado por @hjv).o mejor:
De esta manera, no es un problema intentar eliminar un elemento inexistente (por ejemplo
lst$g <- NULL
)fuente
Existe el paquete rlist ( http://cran.r-project.org/web/packages/rlist/index.html ) para tratar varios tipos de operaciones de listas.
Ejemplo ( http://cran.r-project.org/web/packages/rlist/vignettes/Filtering.html ):
Resultados en:
fuente
No sé si aún necesita una respuesta a esto, pero descubrí por mi experiencia limitada (3 semanas de autoaprendizaje R) con R que, el uso de la
NULL
tarea es realmente incorrecto o subóptimo, especialmente si está actualizando dinámicamente una lista en algo así como un bucle for.Para ser más precisos, usando
arrojará el error
o
Lo que encontré para trabajar más consistentemente es
fuente
[[-5]]
deberían estar entre corchetes, de lo contrario, estará deseleccionando solo el contenido de ese elemento de la lista, no el elemento en sí. Bueno, al menos usar corchetes dobles me da este error: "intento de seleccionar más de un elemento". Lo que funciona para mí fue entonces:myList <- myList[-5]
.Solo quería agregar rápidamente (porque no lo vi en ninguna de las respuestas) que, para una lista con nombre, también puede hacer
l["name"] <- NULL
. Por ejemplo:fuente
Use
-
(signo negativo) junto con la posición del elemento, por ejemplo, si se va a eliminar el tercer elemento, úselo comoyour_list[-3]
Entrada
Eliminar un solo elemento de la lista
Eliminar múltiples elementos de la lista
fuente
En el caso de las listas con nombre, encuentro útiles esas funciones auxiliares
fuente
Usando lapply y grep:
fuente
¿Qué tal esto? Nuevamente, usando índices
o
fuente
m[1:(length(m) - 1)]
si desea evitar índices numéricos, puede usar
para eliminar nombres
namea...namen
de a. esto funciona para listasasí como para vectores
fuente
Puedes usar
which
.fuente
list