2017-05-29 4 views
3

Comment supprimer des lignes dupliquées par groupe avec l'option permettant de choisir combien de lignes dupliquées conserver?Comment supprimer des lignes dupliquées par groupe?

par exemple: S'il vous plaît vérifier l'image Exemple, pour chaque 1 continue V1, supprimer les lignes où la Volume est dupliquée, pour df[2:5,] ligne 5 seront supprimés, pour df[9:10,] ligne 9 sera supprimé, df[15:17,] ligne 15,16 sera supprimé, df[19:20,] ligne 19 sera supprimé.

De même, est-il possible de choisir combien de lignes dupliquées conserver? Par exemple: si je veux conserver 2 lignes en double, le résultat pour df[15:17,] sera df[15:16,] où seule la ligne 17 sera supprimée.

Comment y parvenir sans utiliser des boucles, comment puis-je obtenir ce la façon vectorisé si la vitesse de calcul est plus rapide (en traitant avec des millions de lignes)?

Exemple Photo

Volume Weight V1 V2 
1: 0.5367 0.5367 0 1 
2: 0.8645 0.8508 1 0 
3: 0.8573 0.8585 1 0 
4: 1.1457 1.1413 1 0 
5: 0.8573 0.8568 1 0 
6: 0.5694 0.5633 0 1 
7: 1.2368 1.2343 1 0 
8: 0.9662 0.9593 0 1 
9: 1.4850 1.3412 1 0 
10: 1.4850 1.3995 1 0 
11: 1.1132 1.1069 0 1 
12: 1.4535 1.3923 1 0 
13: 1.0437 1.0344 0 1 
14: 1.1475 1.1447 0 1 
15: 1.1859 1.1748 1 0 
16: 1.1859 1.1735 1 0 
17: 1.1859 1.1731 1 0 
18: 1.1557 1.1552 0 1 
19: 1.1749 1.1731 1 0 
20: 1.1749 1.1552 1 0 

Résultat attendu

Volume Weight V1 V2 
1: 0.5367 0.5367 0 1 
2: 0.8645 0.8508 1 0 
3: 0.8573 0.8585 1 0 
4: 1.1457 1.1413 1 0 
6: 0.5694 0.5633 0 1 
7: 1.2368 1.2343 1 0 
8: 0.9662 0.9593 0 1 
10: 1.4850 1.3995 1 0 
11: 1.1132 1.1069 0 1 
12: 1.4535 1.3923 1 0 
13: 1.0437 1.0344 0 1 
14: 1.1475 1.1447 0 1 
17: 1.1859 1.1731 1 0 
18: 1.1557 1.1552 0 1 
20: 1.1749 1.1552 1 0 
+1

Je pense que votre sortie devrait avoir la ligne 9 au lieu de 10 que vous aviez pris la ligne 3 au lieu de la ligne 5 – akrun

+0

@akrun J'utilise des boucles et le code Choisissez des rangées aléatoires pour les garder à chaque fois que le résultat est différent. – Jimmy

Répondre

2

Nous pouvons utiliser duplicated

setDT(df1)[df1[, (!duplicated(Volume) & V1==1)|V1==0, rleid(V1)]$V1] 

Si nous devons supprimer le double de la direction inverse

setDT(df1)[df1[, (!duplicated(Volume, fromLast = TRUE) & V1==1)|V1==0, rleid(V1)]$V1] 
+0

Merci! BTW, est-il possible de choisir combien de lignes en double à conserver? – Jimmy

+1

@Jimmy Cela pourrait être possible, mais il n'est pas clair sur la logique – akrun

+1

par exemple: si je veux garder 2 lignes dupliquées pour chaque groupe de continus '1' dans' V1', le résultat pour 'df [15:17, ] 'sera' df [15:16,] 'où seule la ligne 17 a été supprimée. Et pour 'df [2: 5,]' aucune ligne ne sera supprimée car il y a déjà deux lignes en double. – Jimmy