Depende que você deseja removê-lo por valor, por exemplo, "o valor 5" ou por índices / índices "o elemento no índice 5" ou "nos índices c (5: 6,10)? Se você deseja remover por valor e não são duplicatas, você deseja remover apenas as duplicatas, a primeira ou a última ocorrência ou todas? É garantido que a lista contenha seu elemento / índice? Precisamos lidar com o caso em que a lista está vazia? garantir nA é passado (/ excluídos) é a lista garantido para ser plana ou pode ser aninhados Quantas laters profundo??
Não encontro documentação explícita para o R sobre como remover elementos das listas, mas tentativa e erro informam
myList [[5]] <- NULL
removerá o quinto elemento e, em seguida, "fechará" o orifício causado pela exclusão desse elemento. Isso é suficiente para os valores do índice, por isso tenho que ter cuidado ao eliminar elementos. Devo trabalhar do final da lista para a frente.
Obrigado, minha lista [i] <- NULL é exatamente a maneira de fazer isso.
1911 David Locke
37
Isto não funcionou para mim. Eu recebo:Error in list[length(list)] <- NULL : replacement has length zero
wfbarksdale
3
Post 's @Aleksandr Levchuck me mostrou que eu estava realmente lidando com um vector e necessário para criar um novo objeto
wfbarksdale
209
Se você não deseja modificar a lista no local (por exemplo, para passar a lista com um elemento removido para uma função), você pode usar a indexação: índices negativos significam "não 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
Além disso, vetores de índice lógicos são úteis:
x[x !="b"];# without elements that are "b"
Isso funciona com quadros de dados também:
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
Seu índice lógico funciona apenas se você tiver esse único item "b" em um elemento da lista. Você não pode remover, digamos, x$bdessa maneira, nem o "b" de um elemento da lista x[[2]] = c("b","k") .
Carl Witthoft 31/01
Em relação a itens únicos vs múltiplos: você pode usar %in%para testar vários itens. Não sei ao certo o que você quer dizer com "não é possível remover x $ b" - você quer dizer remover a coluna inteira b?
Florian Jenn
30
Aqui está como remover o último elemento de uma lista em R:
x <- list("a","b","c","d","e")
x[length(x)]<-NULL
Se x pode ser um vetor, você precisará criar um novo objeto:
Se você possui uma lista nomeada e deseja remover um elemento específico, pode tentar:
lst <- list(a =1:4, b =4:8, c =8:10)if("b"%in% names(lst)) lst <- lst[- which(names(lst)=="b")]
Isso fará com que uma lista lstcom os elementos a, b, c. A segunda linha remove o elemento bdepois de verificar se ele existe (para evitar o problema @hjv mencionado).
ou melhor:
lst$b <-NULL
Dessa forma, não é um problema tentar excluir um elemento inexistente (por exemplo lst$g <- NULL)
como remover os itens python ou lang neste exemplo?
Arthur Yip
9
Não sei se você ainda precisa de uma resposta para isso, mas eu descobri pela minha experiência limitada (3 semanas de autodidata R) com R que, usar a NULLtarefa está realmente errado ou não é ideal, especialmente se você estiver atualizando dinamicamente uma lista em algo como um loop for.
Para ser mais preciso, use
myList[[5]]<-NULL
jogará o erro
myList [[5]] <- NULL: a substituição tem comprimento zero
ou
mais elementos fornecidos do que existem para substituir
O que eu achei para trabalhar de forma mais consistente é
Boa resposta! No entanto, acho que [[-5]]devem ser colchetes simples, caso contrário, você está desmarcando apenas o conteúdo desse elemento da lista, não o próprio elemento. Bem, pelo menos o uso de colchetes duplos me dá o seguinte erro: "tentativa de selecionar mais de um elemento". O que funciona para mim foi, em seguida: myList <- myList[-5].
N1k31t4
4
Só queria adicionar rapidamente (porque não o vi em nenhuma das respostas) que, para uma lista nomeada, você também pode fazer l["name"] <- NULL. Por exemplo:
No caso de listas nomeadas, acho úteis essas funções 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))]
Respostas:
Não conheço R, mas um pouco de pesquisa criativa me levou aqui: http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html
A citação principal de lá:
Uma resposta a essa postagem posteriormente no thread declara:
E a seção relevante do R FAQ diz:
O que parece lhe dizer (de uma maneira um pouco atrasada) como remover um elemento.
Espero que ajude, ou pelo menos leve você na direção certa.
fonte
Error in list[length(list)] <- NULL : replacement has length zero
Se você não deseja modificar a lista no local (por exemplo, para passar a lista com um elemento removido para uma função), você pode usar a indexação: índices negativos significam "não incluir este elemento".
Além disso, vetores de índice lógicos são úteis:
Isso funciona com quadros de dados também:
fonte
x$b
dessa maneira, nem o "b" de um elemento da listax[[2]] = c("b","k")
.%in%
para testar vários itens. Não sei ao certo o que você quer dizer com "não é possível remover x $ b" - você quer dizer remover a coluna inteirab
?Aqui está como remover o último elemento de uma lista em R:
Se x pode ser um vetor, você precisará criar um novo objeto:
fonte
Removendo elementos nulos de uma lista em uma única linha:
x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]
Felicidades
fonte
x
há uma lista vazia. Usecompact
fromplyr
para esta tarefa.-(which(sapply(x,is.null),arr.ind=TRUE))
retornosnamed integer(0)
que eliminarão completamente essa linha.Gostaria de acrescentar que, se for uma lista nomeada, você pode simplesmente usar
within
.Então você pode substituir a lista original
para remover o elemento nomeado
a
da listal
.fonte
within(l, rm(a, b))
Se você possui uma lista nomeada e deseja remover um elemento específico, pode tentar:
Isso fará com que uma lista
lst
com os elementosa
,b
,c
. A segunda linha remove o elementob
depois de verificar se ele existe (para evitar o problema @hjv mencionado).ou melhor:
Dessa forma, não é um problema tentar excluir um elemento inexistente (por exemplo
lst$g <- NULL
)fonte
Existe o pacote rlist ( http://cran.r-project.org/web/packages/rlist/index.html ) para lidar com vários tipos de operações de lista.
Exemplo ( http://cran.r-project.org/web/packages/rlist/vignettes/Filtering.html ):
Resulta em:
fonte
Não sei se você ainda precisa de uma resposta para isso, mas eu descobri pela minha experiência limitada (3 semanas de autodidata R) com R que, usar a
NULL
tarefa está realmente errado ou não é ideal, especialmente se você estiver atualizando dinamicamente uma lista em algo como um loop for.Para ser mais preciso, use
jogará o erro
ou
O que eu achei para trabalhar de forma mais consistente é
fonte
[[-5]]
devem ser colchetes simples, caso contrário, você está desmarcando apenas o conteúdo desse elemento da lista, não o próprio elemento. Bem, pelo menos o uso de colchetes duplos me dá o seguinte erro: "tentativa de selecionar mais de um elemento". O que funciona para mim foi, em seguida:myList <- myList[-5]
.Só queria adicionar rapidamente (porque não o vi em nenhuma das respostas) que, para uma lista nomeada, você também pode fazer
l["name"] <- NULL
. Por exemplo:fonte
Use
-
(sinal negativo) junto com a posição do elemento, por exemplo, se o terceiro elemento for removido, use-o comoyour_list[-3]
Entrada
Remover elemento único da lista
Remover vários elementos da lista
fonte
No caso de listas nomeadas, acho úteis essas funções auxiliares
fonte
Usando lapply e grep:
fonte
Que tal agora? Novamente, usando índices
ou
fonte
m[1:(length(m) - 1)]
se você quiser evitar índices numéricos, pode usar
excluir nomes
namea...namen
de a. isso funciona para listasbem como para vetores
fonte
Você pode usar
which
.fonte
list