使用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 Without1@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