2013-04-28 55 views
8

我試圖識別在矩陣中表示兩次或更多的所有行。識別重複項並標記第一個匹配項和所有其他匹配項

例如:

m <- matrix(c(1,2,1,3,1,4,1,2,2,3,2,3,1,2,5), ncol = 3) 
m 
duplicated(m[,1]) 

輸出:

 [,1] [,2] [,3] 
[1,] 1 4 2 
[2,] 2 1 3 
[3,] 1 2 1 
[4,] 3 2 2 
[5,] 1 3 5 

[1] FALSE FALSE TRUE FALSE TRUE 

不過,我不希望這樣的輸出。我想:

[1] TRUE FALSE TRUE FALSE TRUE 

因爲行[1,1]的值出現3次M的第1列

回答

13

當我看到這個問題我問自己「吉姆霍爾特曼或比爾鄧拉普在Rhelp會提出什麼建議?」。沒有看過檔案,但我認爲他們可能建議使用duplicated這兩個「並行」應用程序,一個使用默認值,另一個使用fromLast參數,並與vector OR運算符結合使用。

duplicated(m[,1]) | duplicated(m[,1], fromLast=TRUE) 
[1] TRUE FALSE TRUE FALSE TRUE 
+2

這應該是'duplicateated()'的參數,以免我們以這樣一個複雜的命令結束。 – 2014-02-18 22:16:35

+1

我不確定這是否是要求修改語言的正確位置。另一個選項可能是'm [,1]%in%duplicated(m [,1])''。這對你來說看起來更自然嗎? – 2014-02-19 02:23:59

2

這裏有許多的一種方法:

m <- matrix(c(1,2,1,3,1,4,1,2,2,3,2,3,1,2,5), ncol = 3) 

x <- table(m[,1]) 
as.character(m[,1]) %in% names(x)[x > 1] 

## > as.character(m[,1]) %in% names(x)[x > 1] 
## [1] TRUE FALSE TRUE FALSE TRUE 

# or wrap it up as function: 

FUN <- function(vec) { 
    x <- table(vec) 
    as.character(vec) %in% names(x)[x > 1] 
} 

FUN(m[, 1]) 

## > FUN(m[, 1]) 
## [1] TRUE FALSE TRUE FALSE TRUE 
+0

是否有對「排序」調用的原因? – Dason 2013-04-28 18:04:09

+0

是的,我剛開始使用'rle'並決定不這樣做。所以是的,但不再。我把它從響應中刪除了。 – 2013-04-28 18:34:59

+0

感謝您的幫助。我試了兩次,他們都成功地工作。 – jeffRey 2013-04-28 19:07:51

相關問題