如何按组删除重复行?
How to delete duplicate rows by group?
如何通过选择保留多少重复行的选项按组删除重复行?
例如:请查看示例图片,对于V1
中的每个连续1,删除Volume
重复的行,对于df[2:5,]
第5行将被删除,因为df[9:10,]
第9行将被删除,df[15:17,]
第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
我们可以用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]
如何通过选择保留多少重复行的选项按组删除重复行?
例如:请查看示例图片,对于V1
中的每个连续1,删除Volume
重复的行,对于df[2:5,]
第5行将被删除,因为df[9:10,]
第9行将被删除,df[15:17,]
第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
我们可以用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]