[問題] 在data frame中移除出現重複元素的 rows

看板R_Language作者 (有咲控 = U =)時間3年前 (2021/02/16 20:55), 編輯推噓12(12039)
留言51則, 9人參與, 3年前最新討論串1/1
假設有一個 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,但由於資料量較大導致會花上不少時間, 想請問有沒有其他方法可以更快解決?謝謝 -- 這是我老婆,如果你之前沒看過,現在再看一次 https://imgur.com/o8uCC4R
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.241.130.39 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1613480106.A.182.html

02/16 21:05, 3年前 , 1F
unique(...)
02/16 21:05, 1F

02/16 21:17, 3年前 , 2F
嗯...我試過 unique, distinct 跟 duplicate,但這些滿
02/16 21:17, 2F

02/16 21:17, 3年前 , 3F
足不了需求,還是說有什麼參數是我沒注意到的?
02/16 21:17, 3F

02/16 21:34, 3年前 , 4F
兩個欄分別distinct之後再bind_cols即可
02/16 21:34, 4F

02/16 21:36, 3年前 , 5F
你的需求有順序問題,意即row1的(1,2)如果選擇留下,row2的(
02/16 21:36, 5F

02/16 21:36, 3年前 , 6F
1,3)就需排除,這種情況下自己寫loop可能是最好的方法,向
02/16 21:36, 6F

02/16 21:36, 3年前 , 7F
量化寫法比較難控制先後順序
02/16 21:36, 7F

02/16 21:36, 3年前 , 8F
distinct(df, X) %>% bind_cols(distinct(df, Y))
02/16 21:36, 8F

02/16 21:39, 3年前 , 9F
樓上如果兩個欄位各自distinct後數量不一樣,這樣還可以bin
02/16 21:39, 9F

02/16 21:39, 3年前 , 10F
d嗎?
02/16 21:39, 10F

02/16 21:56, 3年前 , 11F
兩個各自distinct無法達到要的效果(以上面為例,X=2的
02/16 21:56, 11F

02/16 21:56, 3年前 , 12F
rows不會被砍掉)
02/16 21:56, 12F

02/16 21:58, 3年前 , 13F
如同L大所說,想知道是不是只剩下loop這方法,不然就是
02/16 21:58, 13F

02/16 21:58, 3年前 , 14F
要寫一個底層的函數或是用foreach之類的來加速
02/16 21:58, 14F

02/16 22:16, 3年前 , 15F
補充說明一下,在考慮該row 是否要被移除,就是看該row
02/16 22:16, 15F

02/16 22:16, 3年前 , 16F
的每個值是否在前面的rows任意的變數中出現過
02/16 22:16, 16F

02/16 22:19, 3年前 , 17F
02/16 22:19, 17F

02/16 22:30, 3年前 , 18F
(2,4) or (2,6) 為什麼在預設答案中沒有一個留下?
02/16 22:30, 18F

02/16 22:41, 3年前 , 19F
謝謝S大的程式碼,又學了一課,是快上不少,雖然在實際
02/16 22:41, 19F

02/16 22:41, 3年前 , 20F
數據上還是需要數以分鐘的計算時間,但應該是目前較快
02/16 22:41, 20F

02/16 22:41, 3年前 , 21F
的方法
02/16 22:41, 21F

02/16 22:42, 3年前 , 22F
C大,因為row 1的(1,2)導致後面的rows的X與Y不能出現
02/16 22:42, 22F

02/16 22:42, 3年前 , 23F
1或2
02/16 22:42, 23F

02/16 22:58, 3年前 , 24F
so若先刪x,y共有重複,再刪x,y各自重複,再刪互有重複?
02/16 22:58, 24F

02/16 22:58, 3年前 , 25F

02/16 23:03, 3年前 , 26F
啊我沒有做一般性測試 最後列可能有bug..sorry..概念參考
02/16 23:03, 26F

02/16 23:14, 3年前 , 27F
不會,感謝您的想法,明天來測一下真實數據能多快,謝
02/16 23:14, 27F

02/16 23:14, 3年前 , 28F
02/16 23:14, 28F

02/16 23:35, 3年前 , 29F
感謝17樓S大提供的做法,原來有apply(df,2,"%in%"…)這種寫
02/16 23:35, 29F

02/16 23:35, 3年前 , 30F
法 學習了~FUN的部分竟然能以字串的方式放pipe運算子,好神
02/16 23:35, 30F

02/16 23:35, 3年前 , 31F
奇 哈哈
02/16 23:35, 31F

02/16 23:38, 3年前 , 32F
C大的做法的確有bug喔(一樣也是順序的問題),剛剛幫忙測過
02/16 23:38, 32F

02/16 23:38, 3年前 , 33F
了~遞迴寫法不好寫 S大厲害!!
02/16 23:38, 33F

02/17 13:40, 3年前 , 34F
為什麼我完全看不懂原po的需求@@..
02/17 13:40, 34F

02/17 15:36, 3年前 , 35F
原po 希望得到一個 data.frame 裡面的每個 row 包含的x y
02/17 15:36, 35F

02/17 15:36, 3年前 , 36F
都沒出現在該 row 之前的任一 row 中
02/17 15:36, 36F

02/17 15:37, 3年前 , 37F
然後這些 row 都來自一個給定的 data.frame
02/17 15:37, 37F

02/17 15:57, 3年前 , 38F
row2有y=3了為什麼預期x=3被留下來? 一樣還沒看懂...
02/17 15:57, 38F

02/17 16:12, 3年前 , 39F
應該說從第一列開始,記錄一個set包含出現過的 x, y,如
02/17 16:12, 39F

02/17 16:12, 3年前 , 40F
果接下來的一列裡面包含此set內的值,就丟棄這列;若無就
02/17 16:12, 40F

02/17 16:12, 3年前 , 41F
保留這列,然後將這列x, y放入set中。重複這個步驟到最後
02/17 16:12, 41F

02/17 16:12, 3年前 , 42F
一列,然後輸出保留的列。
02/17 16:12, 42F

02/17 17:36, 3年前 , 43F

02/17 18:34, 3年前 , 44F
for loop的話可能可以在找到對應時馬上排除剩餘所有可能
02/17 18:34, 44F

02/17 18:35, 3年前 , 45F
對應的列,可以減少大量的圈數。
02/17 18:35, 45F

02/17 18:37, 3年前 , 46F
這可讓待比對的資料快速地變少。
02/17 18:37, 46F

02/17 18:59, 3年前 , 47F
A大的做法也不失為一個好方法,效率取決於不重複資料的稀疏
02/17 18:59, 47F

02/17 18:59, 3年前 , 48F
程度~
02/17 18:59, 48F

02/17 19:02, 3年前 , 49F
嗯對,太稀疏不值得嘗試。
02/17 19:02, 49F

02/19 21:20, 3年前 , 50F
借用s大的程式碼當範例 https://ideone.com/0roCLw
02/19 21:20, 50F

02/19 21:21, 3年前 , 51F
數字多的時候快一些,提供參考
02/19 21:21, 51F
文章代碼(AID): #1WAy2g62 (R_Language)