如何按组删除重复行?

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
我认为你的输出应该是第9行而不是第10行,因为你取了第3行而不是第5行。 - akrun
@akrun 我使用循环,代码选择随机行保留,所以每次结果都不同。 - Jimmy
1个回答

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]

谢谢!顺便问一下,是否可以选择保留多少个重复行? - Jimmy
1
@Jimmy 可能是可能的,但逻辑不清楚。 - akrun
1
如果我想在V1连续出现的每组“1”中保留2个重复行,则df [15:17,]的结果将是df [15:16,],其中仅删除了第17行。对于df [2:5,],不会删除任何行,因为已经有两个重复行。 - Jimmy
1
@Jimmy 抱歉,我忙于其他事情。也许可以尝试以下代码:i1 <- df1[, head(.I[((duplicated(Volume)|duplicated(Volume, fromLast = TRUE)) & V1==1)], 2), rleid(V1)]$V1; i2 <- df1[, .I[V1==0]]; df1[sort(c(i1, i2))] - akrun
没问题。谢谢回复。如果我想保留3个重复的行而不是2个,我应该这样做 => i1 <- df1[, head(.I[((duplicated(Volume)|duplicated(Volume, fromLast = TRUE)) & V1==1)], 3), rleid(V1)]$V1; i2 <- df1[, .I[V1==0]]; df1[sort(c(i1, i2))] - Jimmy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接