Tengo un marco de datos que contiene algunos identificadores duplicados. Quiero eliminar registros con identificadores duplicados, manteniendo solo la fila con el valor máximo.
Entonces, para estructurado de esta manera (otras variables no mostradas):
id var_1
1 2
1 4
2 1
2 3
3 5
4 2
Quiero generar esto:
id var_1
1 4
2 3
3 5
4 2
Sé sobre unique () y duplicated (), pero no puedo entender cómo incorporar la regla de maximización ...
Respuestas:
Una forma es ordenar en reversa los datos y usar
duplicated
para descartar todos los duplicados. Para mí, este método es conceptualmente más simple que los que se aplican. Creo que también debería ser muy rápido.Editar: Me acabo de dar cuenta de que la clasificación inversa anterior ni siquiera necesita clasificarse
id
. En suz[order(z$var, decreasing=TRUE),]
lugar, podría usarlo y funcionará igual de bien.Un pensamiento más ... Si la
var
columna es numérica, entonces hay una manera simple de ordenar de maneraid
ascendente, perovar
descendente. Esto elimina la necesidad de la clasificación al final (suponiendo que incluso quisiera que se clasifique).fuente
Realmente desea seleccionar el elemento máximo de los elementos con la misma identificación. Para eso puede usar
ddply
desde el paquete plyr :unique
yduplicated
es para eliminar registros duplicados, en su caso solo tiene identificadores duplicados, no registros.Actualización: Aquí está el código cuando hay variables adicionales:
fuente
La solución base-R implicaría
split
, de esta manera:split
divide el marco de datos en una lista de fragmentos, en el que realizamos el corte a la fila única con el valor máximo y luegodo.call(rbind,...)
reduce la lista de filas individuales en un marco de datos nuevamente.fuente
ave
es un contenedor delapply
+split
, verifique el código (-;order
; Para problemas más genéricossplit
es inevitable.Prefiero usar
ave
fuente
Otra forma de hacer esto con base:
Sin embargo, prefiero la solución plyr de mpiktas.
fuente
Si, como en el ejemplo, la columna var ya está en orden ascendente, no necesitamos ordenar el marco de datos. Simplemente utilizamos la función que
duplicated
pasa el argumentofromLast = TRUE
, por lo que la duplicación se considera desde el reverso, manteniendo los últimos elementos:De lo contrario, primero ordenamos el marco de datos en orden ascendente:
Usando el
dplyr
paquete:fuente