【问题标题】:Joining without matching all rows of 'y' using dplyr使用 dplyr 加入而不匹配“y”的所有行
【发布时间】:2023-03-23 03:19:01
【问题描述】:

基本函数merge 的问题在网上已有详细记录,但仍会造成严重破坏。 plyr::join 解决了许多这些问题并且工作得非常好。街区的新孩子是dplyr。我想知道如何使用dplyr 在下面的示例中执行选项 2。任何人都知道这是否可能,是否应该是功能请求?

可重现的例子

df1 <- data.frame(nm = c("y", "x", "z"), v2 = 10:12)
df2 <- data.frame(nm = c("x", "x", "y", "z", "x"), v1 = c(1, 1, 2, 3, 1))

选项 1:合并

merge(df1, df2, by = "nm", all.x = T, all.y = F)

这并没有提供我想要的东西,而且订单混乱:

##   nm v2 v1
## 1  x 11  1
## 2  x 11  1
## 3  x 11  1
## 4  y 10  2
## 5  z 12  3

选项 2:plyr - 这是我想要的,但它有点慢

library(plyr)
join(df1, df2, match = "first")

注意:只保留 x 中的行:

##   nm v2 v1
## 1  y 10  2
## 2  x 11  1
## 3  z 12  3

选项 3:dplyr:

library(dplyr)
inner_join(df1, df2)

这会改变顺序并保留从 y 开始的行。

##   nm v2 v1
## 1  x 11  1
## 2  x 11  1
## 3  y 10  2
## 4  z 12  3
## 5  x 11  1

left_join(df1, df2)

这里唯一的区别是顺序:

##   nm v2 v1
## 1  y 10  2
## 2  x 11  1
## 3  x 11  1
## 4  x 11  1
## 5  z 12  3

这是一个非常有用的功能,所以令人惊讶的是,选项 2 甚至无法使用 dplyr,除非我错过了什么。

【问题讨论】:

  • df2$v1[match(df1$nm, df2$nm)] 不行吗?这不匹配所有行,只匹配第一次出现

标签: sql r left-join inner-join


【解决方案1】:

我认为使用dplyr 无法实现您要查找的内容。但是,在这种情况下,您可以使用以下代码获得所需的输出。

library(dplyr)    
unique(inner_join(df1, df2))

输出:

  nm v2 v1
1  x 11  1
3  y 10  2
4  z 12  3

【讨论】:

  • 非常感谢您的回答。想象一下,一个先天的 dplyr 解决方案会更快,但这个解决方案绝对有效。
  • 这种方法的唯一问题:它很慢!
猜你喜欢
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2021-02-26
  • 2021-10-23
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多