2013-10-04 79 views
3

這可能是重複的,但我已使用各種不同的關鍵字試圖找到答案並失敗。我想要做的是從數據幀中移除的多個列不匹配的所有實例: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

假設你ids是完整的,連續的,這應該很好的工作只用基礎R:

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

如果不是,這應該在其工作的地方:

​​

我傾向於以下情況需要data.table

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

是的,這將做到這一點!我知道必須有一個簡單的方法來做到這一點,但我無法找到它。謝謝! –

1

這是另一個與plyr,但data.table解決方案肯定是更優雅:

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

感謝這一點,我真的需要學習如何更有效地使用plyr! –

2

ave替代:

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