R:将数据帧减少到两列完全匹配的行

时间:2013-10-04 21:40:28

标签: r

这可能是一个重复,但我已经使用各种不同的关键字试图找到答案并失败。我想要做的是从数据框中删除多个列中的所有不匹配实例:

id = c(1,1,1,2,2,3,3,4,5,5)
type = c("a", "a", "b", "b", "b", "a", "b", "b", "a", "a")
df = data.frame(id,type)


   id type

1   1    a
2   1    a
3   1    b
4   2    b
5   2    b
6   3    a
7   3    b
8   4    b
9   5    a
10  5    a

在这种情况下,我想只保留每个ID上完全匹配的行,所以我的输出应该是

    id type
4   2    b
5   2    b
8   4    b 
9   5    a
10  5    a   

提前感谢任何可以帮助我的人!

3 个答案:

答案 0 :(得分:4)

假设你的ids是完整的和顺序的,这应该只使用基数R很好地工作:

ids = which(tapply(df$type, df$id, function(x) length(unique(x))==1)
subset(df, id %in% ids)

如果不是,这应该取而代之:

ids = unique(df$id)[which(tapply(df$type, df$id, function(x) length(unique(x))==1)]

在这些情况下,我倾向于选择data.table

dt = data.table(df)
dt[,if(length(unique(type))==1) .SD, by=id]

答案 1 :(得分:3)

ave替代方案:

df[ave(as.numeric(df$type), df$id, FUN = function(x) length(unique(x))) == 1, ]

答案 2 :(得分:1)

这是另一个plyr,但data.table解决方案肯定更优雅:

ddply(df, "id", function(d) {
    if (identical(levels(factor(d$type)),levels(df$type))) NULL else d
})