2017-05-29 62 views
3

如何使用选项选择要保留多少重复行的选项来按组删除重复行?如何按组删除重复的行?

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

我觉得你的输出应该具有的,而不是排10 9,你已经采取,而不是5行 – akrun

+0

@akrun我使用循环和代码行3选择一个随机行来保持这样每次结果都不一样。 – 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

谢谢!顺便说一句,是否有可能选择保留多少重复行? – Jimmy

+1

@Jimmy这可能是可能的,但是不清楚逻辑 – akrun

+1

例如:如果我想在'V1'中为每一组连续的'1'保留2个重复行,那么'df [15:17, ]'将会是'df [15:16,]'只有第17行被删除。而对于'df [2:5,]',由于已经有两个重复的行,所以没有行将被删除。 – Jimmy