Eu tenho um quadro de dados chamado "mydata" que se parece com isto:
A B C D
1. 5 4 4 4
2. 5 4 4 4
3. 5 4 4 4
4. 5 4 4 4
5. 5 4 4 4
6. 5 4 4 4
7. 5 4 4 4
Eu gostaria de excluir a linha 2,4,6. Por exemplo, assim:
A B C D
1. 5 4 4 4
3. 5 4 4 4
5. 5 4 4 4
7. 5 4 4 4
Respostas:
A idéia principal é formar um conjunto de linhas que você deseja remover e manter o complemento desse conjunto.
Em R, o complemento de um conjunto é dado pelo operador '-'.
Então, assumindo que o
data.frame
é chamadomyData
:Obviamente, não se esqueça de "reatribuir"
myData
se você quiser eliminar completamente essas linhas - caso contrário, R apenas imprime os resultados.fonte
,
lá! ;)drop = FALSE
lá.-
lo, não funcionará, porque o operador de complemento para lógicos é!
. O complemento de c (2,4,6) nas linhas prefere ser diferenciado (c (2,4,6), 1: nrow (myData)), que não é c (-2, -4, -6) , embora ambos produzam as mesmas linhas quando usados com[
.myData[-c(2, 4, 6),,drop=F]
,. Na verdade, eu sugiro que você sempre insira um,drop=F
pouco antes do]
acesso a qualquer matriz.Você também pode trabalhar com o chamado vetor booleano, também conhecido como
logical
:Observe que o
!
operador atua como um NÃO, ou seja!TRUE == FALSE
:Isso parece um pouco complicado em comparação com a resposta de @ mrwab (+1 btw :)), mas um vetor lógico pode ser gerado em tempo real, por exemplo, onde um valor de coluna excede um determinado valor:
Você pode transformar um vetor booleano em um vetor de índices:
Por fim, um truque muito interessante é que você pode usar esse tipo de subconjunto não apenas para extração, mas também para atribuição:
onde a coluna
A
é atribuídaNA
(não um número) ondeA
excede 4.fonte
Problemas com a exclusão pelo número da linha
Para análises rápidas e sujas, você pode excluir as linhas de um data.frame por número, conforme a resposta principal. Ou seja,
No entanto, se você estiver tentando escrever um script de análise de dados robusto, geralmente evite excluir linhas por posição numérica. Isso ocorre porque a ordem das linhas nos seus dados pode mudar no futuro. Um princípio geral de uma tabela data.frame ou banco de dados é que a ordem das linhas não deve importar. Se o pedido importa, isso deve ser codificado em uma variável real no data.frame.
Por exemplo, imagine que você importou um conjunto de dados e excluiu linhas por posição numérica após inspecionar os dados e identificar os números das linhas que você deseja excluir. No entanto, em algum momento posterior, você acessa os dados brutos, dá uma olhada e reordena os dados. Seu código de exclusão de linha agora excluirá as linhas incorretas e, pior ainda, é improvável que você receba algum erro avisando que isso ocorreu.
Melhor estratégia
Uma estratégia melhor é excluir linhas com base nas propriedades substantivas e estáveis da linha. Por exemplo, se você tiver uma
id
variável de coluna que identifique exclusivamente cada caso, poderá usá-la.Outras vezes, você terá um critério de exclusão formal que pode ser especificado e poderá usar uma das muitas ferramentas de subconjunto no R para excluir casos com base nessa regra.
fonte
Crie uma coluna de identificação no seu quadro de dados ou use qualquer nome de coluna para identificar a linha. Usar o índice não é justo para excluir.
Use a
subset
função para criar um novo quadro.fonte
Por sequência simplificada:
Por sequência:
Por sequência negativa:
Ou se você deseja subconjunto selecionando números ímpares:
Ou, se desejar subconjunto, selecionando números ímpares, versão 2:
Ou se você deseja subconjunto, filtrando números pares:
Ou, se você deseja fazer um subconjunto filtrando números pares, versão 2:
fonte
Exclua Dan de employee.data - Não há necessidade de gerenciar um novo data.frame.
fonte
Aqui está uma função rápida e suja para remover uma linha por índice.
Sua principal falha é que o argumento row_index não segue o padrão R de ser um vetor de valores. Pode haver outros problemas, pois passei apenas alguns minutos escrevendo e testando-o e só comecei a usar o R nas últimas semanas. Quaisquer comentários e melhorias sobre isso serão muito bem-vindos!
fonte
Para completar, acrescentarei que isso também pode ser feito com o
dplyr
usoslice
. A vantagem de usar isso é que ele pode fazer parte de um fluxo de trabalho canalizado.Claro, você também pode usá-lo sem tubos.
O formato "não vetorial"
-c(2, 4, 6)
significa obter tudo o que não está nas linhas 2, 4 e 6. Por exemplo, usando um intervalo, digamos que você queira remover as 5 primeiras linhas, você pode fazer issoslice(df, 6:n())
. Para mais exemplos, consulte os documentos .fonte