子集在R中具有多个匹配条件的数据帧

时间:2012-01-20 21:01:44

标签: r match subset

使用样本数据

> df1 <- data.frame(x=c(1,1,2,3), y=c("a","b","a","b"))
> df1
  x y
1 1 a
2 1 b
3 2 a
4 3 b
> df2 <- data.frame(x=c(1,3), y=c("a","b"))
> df2
  x y
1 1 a
2 3 b

我想从df1中删除df2的所有值对(x,y)。我可以在df2中使用for循环遍历每一行,但我确信有一种更好更简单的方法,我现在想不到。我一直试图做一些从以下开始的事情:

> df1$x %in% df2$x & df1$y %in% df2$y
[1]  TRUE  TRUE FALSE  TRUE

但这不是我想要的,因为df1 [2,] =(1,b)被拉出去除。非常感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

从df2:

构建一组对
prs <- with(df2, paste(x,y,sep="."))

使用类似的成对过程来测试df1中的每一行:

df1[ paste(df1$x, df1$y, sep=".") %in% prs , ]

答案 1 :(得分:1)

您可以反过来:rbind所有内容并删除重复项

out <-rbind(df1,df2)
out[!duplicated(out, fromLast=TRUE) & !duplicated(out),]

  x y
2 1 b
3 2 a