2017-05-29 17 views
3

重複する行をグループごとに削除するには、重複する行の数を選択するオプションを使用します。グループ単位で重複行を削除するにはどうすればよいですか?

例:が削除されますdf[9:10,]行9、df[15:17,]行のため、削除されますdf[2:5,]行5のために、Volumeが重複している行を削除、V1内のすべての連続1のために、例の写真を確認してください15,16削除されると、df[19:20,]行19が削除されます。

また、保持する複製行の数を選択することはできますか?例:2つの重複した行を保持したい場合、df[15:17,]の結果はdf[15:16,]になり、17行だけが削除されます。

ループを使用せずにこれを達成するには、ベクトル化された方法をどのようにして達成するのですか?(何百万行も処理する場合)

例ピクチャー

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 

期待される成果

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

から重複から削除する必要がある場合、私はあなたの出力があなたの代わりに、行の5 – akrun

+0

私はループを使用@akrunし、コードを行3を取っていたとして、行9の代わりに10を持ってすべきだと思います結果が異なるたびに毎回ランダムな行を選択してください。 – Jimmy

答えて

2

我々は使用することができますduplicated

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

我々は逆方向

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

ありがとう! Btw、保持する重複行の数を選択できますか? – Jimmy

+1

@Jimmy可能ですが、論理 – akrun

+1

についてはっきりしません。たとえば、 'V1'の連続する' 1'のグループごとに2つの重複した行を保持したい場合、 'df [15:17、 ] 'は' df [15:16、] 'になり、行17だけが削除されます。また、 'df [2:5、]'の場合、すでに2つの重複行があるので、行は削除されません。 – Jimmy

関連する問題