如何按组删除重复的行?

时间:2017-05-29 03:31:47

标签: r rstudio vectorization

如何按组删除重复的行,并选择要保留多少重复行?

例如:请检查示例图片,对于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

1 个答案:

答案 0 :(得分: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]