查找重復行的索引R中復制的函數執行重復行搜索。如果我們想要刪除重復項,我們只需要編寫df[!duplicated(df),],重復項將從數據框中刪除。但是如何找到重復數據的索引呢?如果duplicated在某行上返回TRUE,則意味著這是數據幀中第二次出現這樣的行,并且可以很容易地獲得其索引。如何獲得該行首次出現的索引?或者,換句話說,重復行與之相同的索引?我可以在data.frame上做一個循環,但我認為這個問題有一個更優雅的答案。
2 回答

忽然笑
TA貢獻1806條經驗 獲得超5個贊
這將返回邏輯索引向量:
duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]
這是一個例子:
df <- data.frame(a = c(1,2,3,4,1,5,6,4,2,1))duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1]#[1] TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUEwhich(duplicated(df) | duplicated(df[nrow(df):1, ])[nrow(df):1])#[1] 1 2 4 5 8 9 10
更新(基于注釋):
如果fromLast = TRUE
用作函數參數,則可以減少命令的復雜性。這比創建兩個反向向量更容易。
duplicated(df) | duplicated(df, fromLast = TRUE)duplicated(df) | duplicated(df, fromLast = TRUE)#[1] TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
這個怎么運作?
該功能duplicated
以相反的行順序應用于原始數據幀和數據幀。后者的輸出再次逆轉。請注意,原始數據中第一次出現的重復值是反轉版本中的最后一次出現。此后,這兩個向量使用組合|
由于TRUE
它們中的至少一個表示重復的值。

喵喵時光機
TA貢獻1846條經驗 獲得超7個贊
如果您使用的是鍵控 data.table,則可以使用以下優雅語法
library(data.table)DT <- data.table(A = rep(1:3, each=4), B = rep(1:4, each=3), C = rep(1:2, 6), key = "A,B,C")DT[unique(DT[duplicated(DT)]),which=T]
打開包裝
DT[duplicated(DT)]
子集那些重復的行。unique(...)
僅返回重復行的唯一組合。這涉及任何重復超過1的案例(重復重復,例如重復等)DT[..., which = T]
將重復的行與原始行合并,并which=T
返回行號(沒有which = T
它只會返回數據)。
你也可以用
DT[,count := .N,by = list(A,B,C)][count>1, which=T]
- 2 回答
- 0 關注
- 725 瀏覽
添加回答
舉報
0/150
提交
取消