2013-04-28 8 views
8

Sto tentando di identificare tutte le righe rappresentate due volte o più in una matrice.Identifica i duplicati e contrassegna la prima occorrenza e tutti gli altri

Ad esempio:

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

Uscite:

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

Tuttavia, non voglio che la produzione. Voglio:

[1] TRUE FALSE TRUE FALSE TRUE 

dal row [1,1] 's valore appare 3 volte nella colonna di m 1.

risposta

13

Quando ho visto questa domanda Mi sono chiesto "cosa consiglierebbe Jim Holtman o Bill Dunlap su Rhelp?". Non ho guardato negli archivi, ma penso che avrebbero potuto consigliare l'utilizzo di due applicazioni "parallele" di duplicated, una con i valori predefiniti e una con il parametro fromLast e congiuntamente con un operatore OR vettoriale.

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

Questo dovrebbe essere un parametro di 'duplicated()' per non finire con un comando così complesso. –

+1

Non sono sicuro che questo sia il posto giusto per chiedere la modifica della lingua. Un'altra opzione potrebbe essere 'm [, 1]% in% duplicato (m [, 1])'. Ti sembra più naturale? –

2

Ecco uno approccio di molti:

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

C'è una ragione per la chiamata a 'sort'? – Dason

+0

Sì, ho iniziato utilizzando 'rle' e ho deciso contro questo. Quindi sì ma non più. L'ho eliminato dalla risposta. –

+0

Grazie per l'aiuto. Ho provato entrambi e hanno entrambi lavorato con successo. – jeffRey

Problemi correlati