2011-10-21 64 views
68

R的duplicated返回一個向量,顯示向量或數據框的每個元素是否具有較小下標的元素的副本。所以,如果行3,4,和一個5行的數據幀的5相同,duplicated會給我矢量查找所有重複行,包括「具有較小下標的元素」

FALSE, FALSE, FALSE, TRUE, TRUE 

但在這種情況下,其實我是想獲得

FALSE, FALSE, TRUE, TRUE, TRUE 

那是,我想知道一行是否與一個較大的下標也重複。

回答

74

duplicated有一個fromLast參數。 ?duplicated的「示例」部分向您展示瞭如何使用它。只需撥打duplicated兩次,一次使用fromLast=FALSE,一次使用fromLast=TRUE,並取TRUE的行數。


一些後期編輯: 您沒有提供一個可重複的例子,所以這裏的親切貢獻的@jbaums

vec <- c("a", "b", "c","c","c") 
vec[duplicated(vec) | duplicated(vec, fromLast=TRUE)] 
## [1] "c" "c" "c" 
+1

但是,這種解決方案是否假設只有2個重複值?如果有2個以上呢?中間的將被忽略。我知道「重複」一詞的字面含義意味着「雙重」,但更強大的解決方案將是@ 42,是的? – JoeM05

+2

堅持下去,我剛剛進行了測試,發現我錯了: 'x < - c(1:9,7:10,5:22); y < - c(字母,字母[1:5]); test < - data.frame(x,y); 測試[重複(測試$ x)|重複(test $ x,fromLast = TRUE),]' 返回他的7,8和9的所有三個副本。爲什麼這會起作用? – JoeM05

+0

因爲無論你從頭到尾,還是從前面開始,都會捕獲中間的。例如,'duplicateated(c(1,1,1))'''duplicateated(c(1,1,1,),fromLast = TRUE)'給出'c(FALSE,TRUE,TRUE)'和'c TRUE,TRUE,FALSE)'。在這兩種情況下,中間值都是「真」。以兩個向量的'|'給出'c(TRUE,TRUE,TRUE)'。 – Brandon

24

您需要組裝duplicated值的集合,應用unique,然後使用%in%進行測試。像往常一樣,一個樣本問題會使這個過程變得活躍起來。

> vec <- c("a", "b", "c","c","c") 
> vec[ duplicated(vec)] 
[1] "c" "c" 
> unique(vec[ duplicated(vec)]) 
[1] "c" 
> vec %in% unique(vec[ duplicated(vec)]) 
[1] FALSE FALSE TRUE TRUE TRUE 
3

我已經有same question一個例子,如果我不是錯了,這也是一個答案。

vec[col %in% vec[duplicated(vec$col),]$col] 

說不上來哪一個是快,不過,我目前使用的數據集不夠大,使該生產顯著時間間隔測試。