给定两个数据帧:

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

我怎样才能做到数据库风格,即sql style, joins?也就是说,我如何获得:


Extra credit:

如何执行SQL风格的select语句?

推荐答案

通过使用merge函数及其可选参数:

Inner join: merge(df1, df2)适用于这些示例,因为R会通过公共变量名自动连接帧,但您很可能希望指定merge(df1, df2, by = "CustomerId"),以确保仅匹配所需的字段.如果匹配变量在不同的数据帧中具有不同的名称,则还可以使用by.xby.y参数.

Outer join: merge(x = df1, y = df2, by = "CustomerId", all = TRUE)

Left outer: merge(x = df1, y = df2, by = "CustomerId", all.x = TRUE)

Right outer: merge(x = df1, y = df2, by = "CustomerId", all.y = TRUE)

Cross join: merge(x = df1, y = df2, by = NULL)

与内部联接一样,您可能希望显式地将"CustomerId"作为匹配变量传递给R我认为,几乎总是最好明确地声明要合并的标识符;输入数据更安全.帧会意外变化,以后更容易阅读.

通过给by一个向量,例如by = c("CustomerId", "OrderId"),可以在多个列上合并.

如果要合并的列名不同,可以指定,例如,by.x = "CustomerId_in_df1", by.y = "CustomerId_in_df2",其中CustomerId_in_df1是第一个数据帧中的列名,CustomerId_in_df2是第二个数据帧中的列名.(如果需要在多个列上合并,这些也可以是向量.)

R相关问答推荐

Row_wise 和 column_wise 使用 fill 和 down/across 填充 NA

如果在订单中匹配代码之前删除行

使用 R while 循环生成随机变量

如何根据先前的正方形递归创建正方形?

使用矩阵图(matplot)作为 map ,位置作为位置

减少名称与模式匹配的列

跨不同数据集跟踪观察结果(例如 sub-reddits)

如何在 R 中调整 plot_ly 绘图的大小

如何为每个条件添加中位数和标准差

在R中从宽到长reshape 数据框

如何根据列表名称对数据进行排序?

将悬停标签重新定位在栏的中间,这样它就不会覆盖标题

取R中数组中所有元素的矩阵乘积?

如何将列变成R中的列名

将一行转换成combine,c()作为r中的向量,然后用向量计算余弦相似度

网络元素名称的几种组合的正则表达式

如何创建一个值而不是一个列表

使用 fill=TRUE 的简单 fread 操作失败

如何为 r markdown pdf 输出创建自定义示例环境?

R:如何在ggplot中将对角线添加到分箱箱线图中