【问题标题】:Conditional JOIN on two data frames in RR中两个数据帧的条件连接
【发布时间】:2018-03-27 02:53:58
【问题描述】:

假设有两个数据框,如下所示(来自this post):

df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))
df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1)))

df1
#  CustomerId Product
#           1 Toaster
#           2 Toaster
#           3 Toaster
#           4   Radio
#           5   Radio
#           6   Radio

df2
#  CustomerId   State
#           2 Alabama
#           4 Alabama
#           6    Ohio

问题是如何在 R 中执行以下 sql 查询:

SELECT * FROM df1 JOIN df2 on df1.CustomerId <= df2.CustomerId

我所知道的是我可以使用merge(df1, df2, by = "CustomerId") 进行内部连接。但是不满足join的条件。

【问题讨论】:

  • library(sqldf); sqldf("SELECT * FROM df1 JOIN df2 on df1.CustomerId &lt;= df2.CustomerId")
  • @G.Grothendieck 那么,不能使用merge函数来完成吗?
  • 看到这个link
  • 你可以这样做,但它会创建一个非常大的中间结果,其中包含来自mergenrow(df1) * nrows(df2) 行:subset(merge(df1, df2, by = NULL), as.character(CustomerId.x) &lt;= as.character(CustomerId.y))
  • @L30n1d45 它不是有条件的。当您阅读我的问题时,我已经参考了它。

标签: sql r merge inner-join


【解决方案1】:

正如我在亲爱的 Grothendieck 在 cmets 中发现的那样,一个简单的解决方案是使用 sqldf 包并以 sql 格式获得我的结果:

library(sqldf)
sqldf("SELECT * FROM df1 JOIN df2 on df1.CustomerId <= df2.CustomerId")

【讨论】:

    【解决方案2】:

    这是一种令人困惑的方法。但它确实有效:

    library(tidyverse)
    df1 = data.frame(CustomerId = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)))
    df2 = data.frame(CustomerId = c(2, 4, 6), State = c(rep("Alabama", 2), rep("Ohio", 1)))
    
    map2_df(
      df1$CustomerId, df1$Product,
      .f = ~ {
        temp <- df2 %>% filter(.x <= CustomerId)
        tibble(CustomerId.x = .x, Product = .y, 
               CustomerId.y = temp$CustomerId, State = temp$State)
      }
    )
    

    【讨论】:

      猜你喜欢
      • 2019-03-14
      • 2020-05-23
      • 2021-10-25
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 2018-01-28
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多