【问题标题】:Semi_join filtering an R dataframe conditionallySemi_join 有条件地过滤 R 数据帧
【发布时间】:2019-07-27 17:23:11
【问题描述】:

数据框 1 (df1) 具有以下列:

Year ID1 ID2 V1 V2 ....

数据框 2 (df2) 具有以下列:

Year ID 

我想使用 df2 执行 semi_join 以按年份和 ID 过滤 df1,但我想在 df1 中保留 ID 与 ID1 或 ID2 匹配的观察结果。我不确定 dplyr 的 semi_join 是否有办法做到这一点,或者是否需要其他方法。

编辑:

df1 = data.frame(Year = c(rep(2000,5), rep(2001,5)), 
                 ID1 = 1:5, 
                 ID2 = 5:1,
                 V1 = seq(1,10, length.out = 10))
df2 = data.frame(Year = c(2000,2000,2001,2001), ID = c(1,2,1,3))

输出

 Year ID1 ID2 V1
 2000 1   5    1
 2000 2   4    2
 2000 4   2    4
 2000 5   1    5
 2001 1   5    6
 2001 3   3    8
 2001 5   1   10

【问题讨论】:

  • 请提供可重现的样本数据(例如使用dput)和匹配的预期输出。
  • 也许可以先将 df1 转换为适当的长格式,然后加入?
  • @MauritsEvers 将其添加到我的帖子中

标签: r dataframe dplyr filtering


【解决方案1】:

这并不优雅,但您可以分别对每个 ID 进行半联接,然后合并结果:

bind_rows(
  semi_join(df1, df2, by = c("ID1" = "ID"),
  semi_join(df1, df2, by = c("ID2" = "ID")
) %>%
  distinct()

(未经测试,没有数据集的样本。)

【讨论】:

  • 如果我可以保证同一观察的 ID1 和 ID2 永远不会相等,我还需要在最后应用 distinct() 吗?
  • 你仍然需要distinct(),以防ID1ID2都在df2$ID中。但如果你能保证ID1ID2df2$ID 中永远不会both 出现,那么你可以省略distinct()。 (对我来说,检查该条件似乎比使用 distinct() 更难。但如果​​您的数据结构方便并且您知道该条件会得到满足,那就去吧!)
猜你喜欢
  • 2014-11-18
  • 1970-01-01
  • 2019-04-07
  • 2011-08-28
  • 2018-08-24
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多