[問題] 在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