在data.frame中显示重复记录并省略单个记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在data.frame中显示重复记录并省略单个记录相关的知识,希望对你有一定的参考价值。
我一直在努力解决如何在R中仅选择重复的data.frame行。对于Instance,我的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
谢谢你的时间...
答案
使用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)), ]
另一答案
village[ duplicated(village),]
另一答案
我发现@Sven的答案使用了重复的“最整洁”,但你也可以通过许多其他方式做到这一点。还有两个:
- 使用
table()
和子集,方法是将列表> 1的名称与第一列中的名称相匹配:village[village$Names %in% names(which(table(village$Names) > 1)), ]
- 使用
ave()
以一种不同的方式“制表”,但以相同的方式子集:village[with(village, ave(as.numeric(Names), Names, FUN = length) > 1), ]
另一答案
我想出了一个使用嵌套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
以上是关于在data.frame中显示重复记录并省略单个记录的主要内容,如果未能解决你的问题,请参考以下文章
as.data.frame 将嵌套列表展平为单行,而不是为每条记录创建行 [重复]