[问题] 在data frame中移除出现重复元素的 rows

楼主: xiangying (xiangying)   2021-02-16 20:54:56
假设有一个 data frame 只有两个变量 X Y,
其数值如下:
X Y
1 2
1 3
2 4
2 6
3 2
3 7
.
.
.
那我希望能够去除出现重复元素的 rows,
所以就会剩下:
X Y
1 2
3 7
.
.
.
目前是用 for loop,但由于资料量较大导致会花上不少时间,
想请问有没有其他方法可以更快解决?谢谢
作者: andrew43 (讨厌有好心推文后删文者)   2021-02-16 21:05:00
unique(...)
楼主: xiangying (xiangying)   2021-02-16 21:17:00
嗯...我试过 unique, distinct 跟 duplicate,但这些满足不了需求,还是说有什么参数是我没注意到的?
作者: wenbuneatble (文本能吃吗)   2021-02-16 21:34:00
两个栏分别distinct之后再bind_cols即可
作者: locka (locka)   2021-02-16 21:36:00
你的需求有顺序问题,意即row1的(1,2)如果选择留下,row2的(1,3)就需排除,这种情况下自己写loop可能是最好的方法,向量化写法比较难控制先后顺序
作者: wenbuneatble (文本能吃吗)   2021-02-16 21:36:00
distinct(df, X) %>% bind_cols(distinct(df, Y))
作者: locka (locka)   2021-02-16 21:39:00
楼上如果两个字段各自distinct后数量不一样,这样还可以bind吗?
楼主: xiangying (xiangying)   2021-02-16 21:56:00
两个各自distinct无法达到要的效果(以上面为例,X=2的rows不会被砍掉)如同L大所说,想知道是不是只剩下loop这方法,不然就是要写一个底层的函数或是用foreach之类的来加速补充说明一下,在考虑该row 是否要被移除,就是看该row的每个值是否在前面的rows任意的变量中出现过
作者: showfeb   2021-02-16 22:19:00
作者: cywhale (cywhale)   2021-02-16 22:30:00
(2,4) or (2,6) 为什么在默认答案中没有一个留下?
楼主: xiangying (xiangying)   2021-02-16 22:41:00
谢谢S大的程式码,又学了一课,是快上不少,虽然在实际数据上还是需要数以分钟的计算时间,但应该是目前较快的方法C大,因为row 1的(1,2)导致后面的rows的X与Y不能出现1或2
作者: cywhale (cywhale)   2021-02-16 22:58:00
so若先删x,y共有重复,再删x,y各自重复,再删互有重复?https://ideone.com/NFdoyO啊我没有做一般性测试 最后列可能有bug..sorry..概念参考
楼主: xiangying (xiangying)   2021-02-16 23:14:00
不会,感谢您的想法,明天来测一下真实数据能多快,谢谢
作者: locka (locka)   2021-02-16 23:35:00
感谢17楼S大提供的做法,原来有apply(df,2,"%in%"…)这种写法 学习了~FUN的部分竟然能以字串的方式放pipe运算子,好神奇 哈哈C大的做法的确有bug喔(一样也是顺序的问题),刚刚帮忙测过了~递回写法不好写 S大厉害!!
作者: evilove (愿意感动就是一种享受)   2021-02-17 13:40:00
为什么我完全看不懂原po的需求@@..
作者: Gjerry   2021-02-17 15:36:00
原po 希望得到一个 data.frame 里面的每个 row 包含的x y都没出现在该 row 之前的任一 row 中然后这些 row 都来自一个给定的 data.frame
作者: andrew43 (讨厌有好心推文后删文者)   2021-02-17 15:57:00
row2有y=3了为什么预期x=3被留下来? 一样还没看懂...
作者: Gjerry   2021-02-17 16:12:00
应该说从第一列开始,记录一个set包含出现过的 x, y,如果接下来的一列里面包含此set内的值,就丢弃这列;若无就保留这列,然后将这列x, y放入set中。重复这个步骤到最后一列,然后输出保留的列。https://ideone.com/J1XkGl
作者: andrew43 (讨厌有好心推文后删文者)   2021-02-17 18:34:00
for loop的话可能可以在找到对应时马上排除剩余所有可能对应的列,可以减少大量的圈数。这可让待比对的资料快速地变少。
作者: locka (locka)   2021-02-17 18:59:00
A大的做法也不失为一个好方法,效率取决于不重复资料的稀疏程度~
作者: andrew43 (讨厌有好心推文后删文者)   2021-02-17 19:02:00
嗯对,太稀疏不值得尝试。
作者: kokolotl (nooooooooooo)   2021-02-19 21:20:00
借用s大的程式码当范例 https://ideone.com/0roCLw数字多的时候快一些,提供参考

Links booklink

Contact Us: admin [ a t ] ucptt.com