2013-04-28 11 views
8

Próbuję zidentyfikować wszystkie wiersze, które są reprezentowane dwa razy lub więcej w macierzy.Identyfikacja duplikatów i zaznaczenie pierwszego wystąpienia i wszystkich innych

Na przykład:

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

Wyjścia:

 [,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 

Jednak nie chcę tego wyjścia. Że ma:

[1] TRUE FALSE TRUE FALSE TRUE 

, ponieważ hałas [1,1] ma wartość pojawia się 3 razy w kolumnie M 1.

Odpowiedz

13

Kiedy widział na to pytanie Zadałem sobie pytanie "co Jim Holtman lub Bill Dunlap doradzą w sprawie Rhelp?". Nie zajrzałem do archiwów, ale myślę, że mogli zalecić użycie dwóch "równoległych" aplikacji duplicated, jednej z ustawieniami domyślnymi i jednej z parametrem fromLast i łączącej się z operatorem wektorowych OR.

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

Powinno to być parametrem 'duplicated()', bo skończy się tak skomplikowanym poleceniem. –

+1

Nie jestem pewien, czy to właściwe miejsce, aby poprosić o zmianę języka. Inną opcją może być "m [, 1]% w% zduplikowany (m [, 1])". Czy to wydaje ci się bardziej naturalne? –

2

Oto jeden podejście wiele:

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

Czy jest jakiś powód, aby wezwanie do "sortowania"? – Dason

+0

Tak, zacząłem od użycia 'rle' i zdecydowałem się na to. Tak, ale już nie. Usunąłem go z odpowiedzi. –

+0

Dzięki za pomoc. Próbowałem obu, a oni obaj pracowali z powodzeniem. – jeffRey

Powiązane problemy