J'ai une trame de données qui contient des identifiants en double. Je souhaite supprimer les enregistrements avec des ID en double, en ne conservant que la ligne avec la valeur maximale.
Donc, pour une structure comme celle-ci (autres variables non affichées):
id var_1
1 2
1 4
2 1
2 3
3 5
4 2
Je veux générer ceci:
id var_1
1 4
2 3
3 5
4 2
Je connais unique () et dupliqué (), mais je ne sais pas comment incorporer la règle de maximisation ...
Réponses:
Une façon consiste à trier les données en sens inverse et
duplicated
à supprimer tous les doublons. Pour moi, cette méthode est conceptuellement plus simple que celles qui s'appliquent. Je pense que ça devrait aussi être très rapide.Edit: Je viens de réaliser que le tri inversé ci-dessus n'a même pas besoin d'être trié du
id
tout. Vous pouvez simplement utiliser à laz[order(z$var, decreasing=TRUE),]
place et cela fonctionnera aussi bien.Une dernière pensée ... Si la
var
colonne est numérique, il existe un moyen simple de trier de manièreid
ascendante, maisvar
descendante. Cela élimine la nécessité du tri à la fin (en supposant que vous vouliez même qu'il soit trié).la source
Vous voulez vraiment sélectionner l'élément maximum parmi les éléments avec le même identifiant. Pour cela, vous pouvez utiliser à
ddply
partir du package plyr :unique
etduplicated
sert à supprimer les enregistrements en double, dans votre cas, vous n'avez que des identifiants en double, pas des enregistrements.Mise à jour: voici le code quand il y a des variables supplémentaires:
la source
La solution base-R impliquerait
split
, comme ceci:split
divise le bloc de données en une liste de blocs, sur laquelle nous effectuons la découpe sur la seule ligne avec la valeur maximale, puisdo.call(rbind,...)
réduit à nouveau la liste des lignes simples dans un bloc de données.la source
ave
est un wrapper delapply
+split
, vérifiez le code (-;order
; pour des problèmes plus génériquessplit
est inévitable.Je préfère utiliser
ave
la source
Encore une autre façon de le faire avec la base:
Je préfère cependant la solution plyr de mpiktas.
la source
Si, comme dans l'exemple, la colonne var est déjà dans l'ordre croissant, nous n'avons pas besoin de trier le bloc de données. Nous utilisons simplement la fonction
duplicated
passant l'argumentfromLast = TRUE
, donc la duplication est considérée du revers, en gardant les derniers éléments:Sinon, nous trions d'abord le bloc de données dans l'ordre croissant:
Utilisation du
dplyr
package:la source