Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:将数据帧减少为跨两列完全匹配的行_R - Fatal编程技术网

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!