【发布时间】: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