2013-01-11 40 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