2013-04-28 57 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

相关问题