这可能是一个重复,但我已经使用各种不同的关键字试图找到答案并失败。我想要做的是从数据框中删除多个列中的所有不匹配实例:
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
提前感谢任何可以帮助我的人!
答案 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
})