【问题标题】:Subset a data frame with multiple match conditions in R在R中对具有多个匹配条件的数据框进行子集
【发布时间】:2012-01-20 21:01:43
【问题描述】:

附样本数据

> 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) 被拉出以进行删除。非常感谢您的帮助。

【问题讨论】:

标签: r match subset


【解决方案1】:

从 df2 构建一组对:

prs <- with(df2, paste(x,y,sep="."))

用类似的过程测试 df1 中的每一行,以获得对组中的成员资格:

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

【讨论】:

  • 非常感谢 DWin。当我研究这个问题时,我已经查看了您之前回复的主题,但是对所提出的问题感到困惑,并且没有意识到我可以将其应用于我的问题。再次道歉并再次感谢!
  • 我明白了。从 cmets 可以看出,我也很困惑。你的问题更清楚了。
【解决方案2】:

你可以反过来:rbind一切并删除重复项

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

  x y
2 1 b
3 2 a

【讨论】:

  • 这是另一种解决方案,它适用于此处的示例数据。但是,对于我的真实数据,它不起作用,因为 df1 具有多个重复行。不过谢谢!
猜你喜欢
  • 2021-05-29
  • 2021-06-05
  • 2015-04-24
  • 2021-08-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
相关资源
最近更新 更多