下面是一个示例数据框,显示了我的问题和我想要实现的目标。这里我有两个列x
和y
,我想要从中删除重复项。我还有一个列z
,它包含行的排序秩。
x y z
1 A BB 8
2 B BB 7.5
3 B AA 6.2
4 B CC 5
5 C DD 4
6 D CC 3
字符串
我试图同时查看x
和y
,每次在任一列中有重复时,删除该行并继续。
我想要的最终结果是
x y z
1 A BB 8
3 B AA 6.2
5 C DD 4
6 D CC 3
型y
列中的第二个BB
被删除。然后B - AA
行没有被删除,因为逐行向下,它现在是x
列中的第一个B
。这是一个大数据集,所以不幸的是我不能手工完成。
我不想把这两个列组合在一起,也不想一次删除一个重复的列,因为这样做会删除太多的观察结果。
如何才能做到这一点?
4条答案
按热度按时间pgky5nke1#
由于我们需要同时检查两列,我怀疑我们是否可以使用
duplicated()
顺序检查x和y列,所以这里是我的报价,速度较慢,但可能更可靠:字符串
测试结果:
型
对于编辑的数据集,它也返回OP所期望的结果:
型
v64noz0r2#
看起来你需要迭代地检查最新的一行,并决定是否应该保留或删除它。在这种情况下,你可以像下面这样尝试
Reduce
,其中行索引迭代地更新:字符串
或
型
这给
型
数据
型
mxg2im7a3#
显然,你想从第二列开始,迭代地删除前两列中连续的重复项。我们可以尝试使用
repeat
循环,在第二列和第一列之间迭代,直到没有更多的重复项:字符串
注意,我已经添加了一个E-CC行,但它已被成功删除。您可以进一步测试。
型
i2byvkas4#
这解决了我的问题。
字符串
我创建了一个函数,它接受一个日期帧,并将首先为x和y改变
row_numbers()
列。这样我们就有了两个名为xrep
和yrep
的列,我们可以在其中找到最顶部的重复。然后我只需切片找到的第一行,大于1
,然后我返回 Dataframe 。由于这是一个函数,我只需在一个while(TRUE)
的情况,只要等到重复列中没有2's
,这是当我们知道没有更多的重复。下面是第一次运行后的一个例子。然后,由于
yrep
列中的2
,它将对第二行进行切片。之后,它返回 Dataframe ,然后重复重新计算 Dataframe 的过程。然后再次切片。型
这不是一个干净的解决方案,但它完成了工作。