r语言 - 基于不等式条件连接两个数据集



我使用下面的调用来根据不等式条件"连接"我的数据集:

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        

最新更新