R:将数据帧减少为跨两列完全匹配的行
这可能是重复,但我使用了各种不同的关键字试图找到答案,但都失败了。我要做的是从数据帧中删除跨多个列的所有不匹配实例:R:将数据帧减少为跨两列完全匹配的行,r,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
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
提前感谢任何能在这里帮助我的人 假设您的
id
是完整的和连续的,这应该只使用base 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)]
我倾向于选择数据。对于这些情况,表:
dt = data.table(df)
dt[,if(length(unique(type))==1) .SD, by=id]
下面是另一个带有plyr
的解决方案,但是data.table
解决方案肯定更优雅:
ddply(df, "id", function(d) {
if (identical(levels(factor(d$type)),levels(df$type))) NULL else d
})
ave
备选方案:
df[ave(as.numeric(df$type), df$id, FUN = function(x) length(unique(x))) == 1, ]
是的,这就行了!我知道必须有一个直截了当的方法来做到这一点,但我就是找不到。谢谢谢谢,我真的需要学习如何更有效地使用plyr!