2013-01-11 39 views
1

我一直在如何选择R.的data.frame仅重复的行挣扎 例如,我data.frame是:显示重复记录,并忽略那些单

age=18:29 
height=c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5) 
Names=c("John","John","John", "Harry", "Paul", "Paul", "Paul", "Khan", "Khan", "Khan", "Sam", "Joe") 
village <- data.frame(Names, age, height) 

Names age height 
John 18 76.1 
John 19 77.0 
John 20 78.1 
Harry 21 78.2 
Paul 22 78.8 
Paul 23 79.7 
Paul 24 79.9 
Khan 25 81.1 
Khan 26 81.2 
Khan 27 81.8 
Sam 28 82.8 
Joe 29 83.5 

我希望看到的结果如下:

Names age height 
John 18 76.1 
John 19 77.0 
John 20 78.1 
Paul 22 78.8 
Paul 23 79.7 
Paul 24 79.9 
Khan 25 81.1 
Khan 26 81.2 
Khan 27 81.8 

感谢您的时间...

回答

3

使用duplicated两次的解决方案:

village[duplicated(village$Names) | duplicated(village$Names, fromLast = TRUE), ] 


    Names age height 
1 John 18 76.1 
2 John 19 77.0 
3 John 20 78.1 
5 Paul 22 78.8 
6 Paul 23 79.7 
7 Paul 24 79.9 
8 Khan 25 81.1 
9 Khan 26 81.2 
10 Khan 27 81.8 

的替代解决方案与by

village[unlist(by(seq(nrow(village)), village$Names, 
        function(x) if(length(x)-1) x)), ] 
+0

完美...谢谢! –

+0

@ M.Qasim你为什么不再接受这个答案? –

+0

这是一个很好的答案先生...对不起,延迟,我离开了一段时间... –

1
village[ duplicated(village),] 
1

我发现@斯文使用的回答重复的“整洁的”,但你也可以做到这一点其他许多方面。这里有两个更多:

  1. 使用table()和子集通过匹配其中制表> 1与存在于所述第一列中的名称的名称:

    village[village$Names %in% names(which(table(village$Names) > 1)), ] 
    
  2. 使用ave()中的“制表”有一点不同的方式,但子集以同样的方式:

    village[with(village, ave(as.numeric(Names), Names, FUN = length) > 1), ] 
    
0

我想出了一个使用嵌套sapply的解决方案:

> village_dups = 
village[unique(unlist(which(sapply(sapply(village$Names,function(x) 
which(village$Names==x)),function(y) length(y)) > 1))),] 
> village_dups 
    Names age height 
1 John 18 76.1 
2 John 19 77.0 
3 John 20 78.1 
5 Paul 22 78.8 
6 Paul 23 79.7 
7 Paul 24 79.9 
8 Khan 25 81.1 
9 Khan 26 81.2 
10 Khan 27 81.8