R中两个数据帧的条件连接
Posted
技术标签:
【中文标题】R中两个数据帧的条件连接【英文标题】:Conditional JOIN on two data frames in R 【发布时间】: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 <= df2.CustomerId")
@G.Grothendieck 那么,不能使用merge
函数来完成吗?
看到这个link
你可以这样做,但它会创建一个非常大的中间结果,其中包含来自merge
的nrow(df1) * nrows(df2)
行:subset(merge(df1, df2, by = NULL), as.character(CustomerId.x) <= as.character(CustomerId.y))
@L30n1d45 它不是有条件的。当您阅读我的问题时,我已经参考了它。
【参考方案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)
)
【讨论】:
以上是关于R中两个数据帧的条件连接的主要内容,如果未能解决你的问题,请参考以下文章
Python:两个数据帧的外部连接或合并给出错误:TypeError:unhashable type:'numpy.ndarray'