Eu tenho um quadro de dados que contém alguns IDs duplicados. Quero remover registros com IDs duplicados, mantendo apenas a linha com o valor máximo.
Portanto, para estruturado como este (outras variáveis não mostradas):
id var_1
1 2
1 4
2 1
2 3
3 5
4 2
Eu quero gerar isso:
id var_1
1 4
2 3
3 5
4 2
Eu sei sobre unique () e duplicated (), mas não consigo descobrir como incorporar a regra de maximização ...
Respostas:
Uma maneira é ordenar reversamente os dados e usá
duplicated
-los para eliminar todas as duplicatas. Para mim, esse método é conceitualmente mais simples do que aqueles que se aplicam. Eu acho que deveria ser muito rápido também.Edit: Acabei de perceber que a ordem inversa acima nem precisa ser ordenada
id
. Você pode simplesmente usarz[order(z$var, decreasing=TRUE),]
e ele também funcionará.Mais um pensamento ... Se a
var
coluna for numérica, existe uma maneira simples de classificar, de modo queid
esteja subindo, masvar
descendo. Isso elimina a necessidade da classificação no final (supondo que você queira que ela seja classificada).fonte
Você realmente deseja selecionar o elemento máximo dos elementos com o mesmo ID. Para isso, você pode usar o
ddply
pacote plyr :unique
eduplicated
é para remover registros duplicados; no seu caso, você tem apenas IDs duplicados, não registros.Atualização: Aqui está o código quando existem variáveis adicionais:
fonte
A solução base-R envolveria
split
, assim:split
divide o quadro de dados em uma lista de blocos, na qual executamos o corte na única linha com valor máximo edo.call(rbind,...)
reduz a lista de linhas únicas em um quadro de dados novamente.fonte
ave
é um invólucro delapply
+split
, verificar o código de (-;order
; para problemas mais genéricossplit
é inevitável.Eu prefiro usar
ave
fonte
Ainda outra maneira de fazer isso com base:
Eu prefiro a solução plyr dos mpiktas.
fonte
Se, como no exemplo, a coluna var já estiver em ordem crescente, não precisaremos classificar o quadro de dados. Nós apenas usamos a função que
duplicated
passa o argumentofromLast = TRUE
, portanto, a duplicação é considerada do lado oposto, mantendo os últimos elementos:Caso contrário, classificaremos o quadro de dados em ordem crescente primeiro:
Usando o
dplyr
pacote:fonte