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
duplicatedpara 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
varcolumna es numérica, entonces hay una manera simple de ordenar de maneraidascendente, perovardescendente. 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
ddplydesde el paquete plyr :uniqueyduplicatedes 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:splitdivide 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
avees un contenedor delapply+split, verifique el código (-;order; Para problemas más genéricossplites inevitable.Prefiero usar
avefuente
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
duplicatedpasa 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
dplyrpaquete:fuente