semi_join 在 R 中但拉回重复项

Posted

技术标签:

【中文标题】semi_join 在 R 中但拉回重复项【英文标题】:semi_join in R but pull back duplicates 【发布时间】:2017-05-25 05:19:44 【问题描述】:

我遇到了来自 dplyr 的 semi_join 问题。理想情况下,我想对 dfA 与 dfB 进行半联接。 dfA 具有重复值,dfB 也是如此。我想从 dfA 中撤回所有与 dfB 匹配的值,甚至在 dfA 中重复。

dfA              dfB               >>     dfC
x    y    z      x    g                   x    y    z   
1    r    5      1    lkm                 1    r    5
1    b    4      1    pok                 1    b    4
2    4    e      2    jij                 2    4    e
3    5    r      2    pop                 3    5    r
3    9    g      3    hhg                 3    9    g
4    3    0      5    trt

我想得到的是上面的 dfC 输出。因为至少有 1 个 x 匹配,所以它会拉回 dfA 中的所有 x

semi_join(dfA, dfB, by = "x")
dfC
x    y    z  
1    r    5
2    4    e
3    5    r


inner_join(dfA, dfB, by = "x")
x    y    z    g  
1    r    5    lkm
1    r    5    pok
1    b    4    lkm
1    b    4    pok
2    4    e    jij
2    4    e    pop
3    5    r    hhg
3    9    g    hhg

这两者都没有给我正确的结果。任何帮助都会很棒!提前致谢

【问题讨论】:

dfA[dfA$x %in% dfB$x,] 【参考方案1】:

不知道为什么需要 join :只需使用 %in%

library(data.table)
setDT(dfA)[x %in% dfB$x,]

# simple base R approach :
dfA[dfA$x %in% dfB$x,]

【讨论】:

感谢@joel.wilson - 我在学习 R 方面还是新手,所以我现在使用的是我所知道的。您的解决方案有效,但它也与我的 semi_join 解决方案相匹配。在 semi_join 上,它不会拉回整个行的重复项吗?或他们的钥匙的副本?我担心它是关键,但从这个例子看来,它是重复的整行。如果是,我上面的例子是错误的。 @MattW。如果我没有错,它会拉出整行。没怎么用semi_join @joel.wilson 这可以解释我们得出相同的结论。这解决了我的问题。非常感谢您的回复!大量帮助【参考方案2】:

如果您正在使用 dplyr 并继续通过管道传递它

library(dplyr)
dfA %>% filter(x %in% dfB$x)

【讨论】:

这也有效!非常感谢。感谢您的帮助

以上是关于semi_join 在 R 中但拉回重复项的主要内容,如果未能解决你的问题,请参考以下文章

C ++的函数正则表达式在linux(CentOS)中但在OSX中遇到错误[重复]

【R去重】 保留第一个重复/去所有的重复

使用 R 如何删除基于多列的重复项,但选择重复项的“最完整”版本

无论如何将存储桶中的数据合并到表中但没有任何重复的行?

基于R中的两列删除重复项[重复]

R:如何在 R 中的两个重复项之间包含一个字符?