vaciar una todos repetidos los listas lista eliminar elementos elemento r list indexing

r - una - listas en python



¿Cómo puedo eliminar un elemento de una lista? (15)

¿Qué tal esto? De nuevo, utilizando índices.

> m <- c(1:5) > m [1] 1 2 3 4 5 > m[1:length(m)-1] [1] 1 2 3 4

o

> m[-(length(m))] [1] 1 2 3 4

Tengo una lista y quiero eliminar un solo elemento de ella. ¿Cómo puedo hacer esto?

He intentado buscar lo que creo que los nombres obvios para esta función estarían en el manual de referencia y no he encontrado nada apropiado.


Aquí es cómo eliminar 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ías crear un nuevo objeto:

x <- c("a", "b", "c", "d", "e") x <- x[-length(x)]

  • Trabajo para listas y vectores.

Eliminando elementos nulos de una lista en una sola línea:

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

Aclamaciones


En el caso de listas nombradas, encuentro útiles las funciones de ayuda.

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


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

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

Resultados 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


Me gustaría agregar que si se trata de una lista con nombre , simplemente puede utilizarla.

l <- list(a = 1, b = 2) > within(l, rm(a)) $b [1] 2

Para que pueda sobrescribir la lista original.

l <- within(l, rm(a))

para eliminar un elemento llamado a de la lista l .


No sé R en absoluto, pero un poco de googlear creativo me llevó aquí:

La cita clave de allí:

No encuentro documentación explícita para R sobre cómo eliminar elementos de las listas, pero el método de prueba y error me dice

myList [[5]] <- NULL

eliminará el quinto elemento y luego "cerrará" el orificio 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 la parte posterior de la lista hacia el frente.

Una respuesta a ese post más adelante en el hilo dice:

Para eliminar un elemento de una lista, consulte R Preguntas frecuentes 7.1

Y la sección correspondiente de la R FAQ dice:

... No establezca x [i] o x [[i]] en NULL, ya que esto eliminará el componente correspondiente de la lista.

Lo que parece decirte (de una manera un tanto al revés) cómo eliminar un elemento.

Espero que eso ayude, o al menos te guíe en la dirección correcta.


No sé si todavía necesita una respuesta a esta pregunta, pero descubrí, por mi experiencia limitada (3 semanas de autoaprendizaje R) con R, que usar la asignación NULL es realmente incorrecto o subóptimo, especialmente si es dinámico. actualizando una lista en algo así como un for-loop.

Para ser más precisos, utilizando

myList[[5]] <- NULL

tirará el error

myList [[5]] <- NULL: el reemplazo tiene una longitud cero

o

Más elementos suministrados que para reemplazar.

Lo que encontré para trabajar más consistentemente es

myList <- myList[[-5]]


Si desea evitar índices numéricos, puede utilizar

a <- setdiff(names(a),c("name1", ..., "namen"))

para borrar nombres namea...namen de a. esto funciona para listas

> l <- list(a=1,b=2) > l[setdiff(names(l),"a")] $b [1] 2

así como para vectores

> v <- c(a=1,b=2) > v[setdiff(names(v),"a")] b 2


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 índices lógicos son útiles:

x[x != "b"]; # without elements that are "b"

Esto también funciona con los 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


Si tiene una lista con nombre y desea eliminar un elemento específico, puede probar:

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 con los elementos a , b , c . La segunda línea elimina el elemento b después de verificar 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 )


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:

l <- list(a = 1, b = 2, cc = 3) l[''b''] <- NULL


Usando lapply y 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))]


Use - (Signo negativo) junto con la posición del elemento, ejemplo, si se va a eliminar el 3er elemento, utilícelo como your_list[-3]

Entrada

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

Eliminar elemento único de la lista

my_list[-3] # $`a` # [1] 3 # $b # [1] 3 # $d # [1] "Hello" # $e [1] NA

Eliminar múltiples elementos de la lista

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


Usted puede utilizar which .

x<-c(1:5) x #[1] 1 2 3 4 5 x<-x[-which(x==4)] x #[1] 1 2 3 5