我使用下面的调用来根据不等式条件"连接"我的数据集:
library(sqldf)
sqldf("select *
from dataset1 a,
dataset2 b
a.col1 <= b.col2")
然而,有没有一种方法,我可以做到这一点没有sqldf?
到目前为止,我只能看到基于特定公共列的简单连接的合并函数。
谢谢!
最近在数据中实现了非对等(或条件)连接。表,并在当前开发版本v1.9.7中可用。
require(data.table) # v1.9.7+
setDT(dataset1) # convert to data.tables
setDT(dataset2)
dataset1[dataset2, on=.(col1 < col2), nomatch=0L]
对于dataset2
的每一行,在连接提供给on
参数的条件时找到匹配的行索引,并返回匹配行的所有列
我有这个问题几次,我想我得到了一个解决方案使用dplyr
!就效率而言,它可能不是最好的,但它确实有效。我假设您在每种情况下都有一个称为"dummy"的常量变量(或者,它可以是另一个要连接的变量)。此外,我假设dataset1的列是a_colj, dataset2的列是b_colj:
dataset1 %>%
inner_join(dataset2, by='dummy') %>%
filter(a_col1 <= b_col2)
您完全可以使用merge
分两步完成。
示例(合并的具体细节由您决定):
lessRows <- which(df1$col1 < df2$col2)
df3 <- merge(df1, df2)[lessRows, ]
在dplyr
中,您可以使用join_by
进行不等式连接。使用closest
只获取最接近的匹配:
sales <- tibble(
id = c(1L, 1L, 1L, 2L, 2L),
sale_date = as.Date(c("2018-12-31", "2019-01-02", "2019-01-05", "2019-01-04", "2019-01-01"))
)
sales
# id sale_date
# 1 1 2018-12-31
# 2 1 2019-01-02
# 3 1 2019-01-05
# 4 2 2019-01-04
# 5 2 2019-01-01
promos <- tibble(
id = c(1L, 1L, 2L),
promo_date = as.Date(c("2019-01-01", "2019-01-05", "2019-01-02"))
)
# id promo_date
# 1 1 2019-01-01
# 2 1 2019-01-05
# 3 2 2019-01-02
left_join(sales, promos, join_by(id, sale_date >= promo_date))
# id sale_date promo_date
# 1 1 2018-12-31 NA
# 2 1 2019-01-02 2019-01-01
# 3 1 2019-01-05 2019-01-01
# 4 1 2019-01-05 2019-01-05
# 5 2 2019-01-04 2019-01-02
# 6 2 2019-01-01 NA