使用merge()和sqldf::sqldf()获得相同的交叉连接

使用merge()和sqldf::sqldf()获得相同的交叉连接,r,sqldf,R,Sqldf,我有两个数据框:销售和客户。我想使用sqldf::sqldf()和merge()对这些数据帧执行交叉连接,并使用这两种方法获得完全相同的结果 到目前为止,我只能获得两个数据帧,其中的行顺序不同 这是生成销售和客户数据帧的代码: set.seed(1) 销售我认为在sqldf中包含orderby是很重要的,因为在SQL中,除非明确指示,否则无法保证订购 如果您在两个变量上都进行简单的ORDER BY,那么在R中直接转换为ORDER。然而,由于一个变量在减少,一个变量在增加,order本身并不能解决

我有两个数据框:
销售
客户
。我想使用
sqldf::sqldf()
merge()
对这些数据帧执行交叉连接,并使用这两种方法获得完全相同的结果

到目前为止,我只能获得两个数据帧,其中的行顺序不同

这是生成
销售
客户
数据帧的代码:

set.seed(1)

销售我认为在
sqldf
中包含
orderby
是很重要的,因为在SQL中,除非明确指示,否则无法保证订购

如果您在两个变量上都进行简单的
ORDER BY,那么在R中直接转换为ORDER。然而,由于一个变量在减少,一个变量在增加,
order
本身并不能解决这个问题。但是,正如所建议的,我们可以对
xtfrm
执行相同的操作


out1 With
out1@r2evans谢谢您的评论。实际上,我不想让结果按任何特定变量排序,我只想得到两个相等的数据帧。
sqldf()
中的
orderby
子句和
select
子句后面的变量只是我试图复制通过
merge()获得的默认顺序
但到目前为止我还没有成功。@r2evans我编辑了这个问题,以包含更多信息,并使我更容易理解我试图完成的任务。在处理SQL数据库时(您可能已经知道这一点):除非您显式地将其设置为“order by”,否则您无法信任数据返回的顺序。它可能会也可能不会遵守进入它的数据顺序。一般来说,这就是SQL,我不知道SQLite是否遵循自然(导入)顺序。但听起来好像您试图让
sqldf
模拟
合并
输出的顺序,对吗?呵呵。这听起来像是一种学术追求,下这个兔子洞的理由是什么?@r2evans是的,这就是我试图做的。我有一些讲课幻灯片,其中包含使用
merge
的所有表联接,我试图用
sqldf
中的等效联接来并行这些联接。我的课程的重点是R,而不是SQL,但我决定加入一些SQL示例(使用
sqldf
),这样我的学生就不会在工作时看到他们的第一个SQL代码(几年前发生在我身上)。我以前使用过SQL,但主要是通过R和(在我以前的工作中)SAS,但自从我学会了dplyr之后,我就不再使用
sqldf
。我明白了。因为你在做它们的笛卡尔积,所以顺序是由输入本身控制的,而不是由值本身的任何属性控制的。如果查看
merge
的源代码,您将看到它是通过
expand.grid
完成的,其中第一个参数首先迭代。我不知道您是否可以在SQL中轻松模仿
expand.grid
中出现的排序(缺少排序)。在内部,如果
nx与此相关,那么在给定数据上下文的情况下,应用排序后的
合并
,然后在SQL中复制,可能会很有帮助。(如果客户id字符串中没有去年,这可能会很有用……这似乎违背了我关于按客户id订购的假设:-)。再次感谢您的宝贵见解!您建议在给定数据上下文的情况下应用post-
合并
排序,这可能是处理实际数据的最佳和最安全的方法。我知道交叉连接客户和销售表可能永远没有意义,但我想使用相同的数据来演示所有合并。由于这是一个学术虚构的例子,我想我会采纳你的建议,使用一个数字
CustomerID
,以及一个
Clients
表,该表按
CustomerID
预先排序。然后使用
ORDER BY Clients.CustomerID
无论如何,我一直希望
Clients
表按
CustomerID
排序,但在创建示例时,我忽略了字符串的排序方式。在
CustomerID
中包含上一年,字符串结果是个坏主意。
## Sales                        ## Clients        
  Product CustomerID Price        CustomerID State
1 Toaster     1_2019    37      1     2_2019    AZ
2   Radio     1_2019    33      2     3_2019    MA
3   Radio     2_2019    33      3     4_2019    AZ
4      TV     3_2019   408      4     1_2020    IL
5 Toaster     1_2020    37      5     2_2020    MA
6      TV     2_2020   408
7      TV     3_2020   408