1

努力学习 R,但似乎在 SQL 中非常简单的事情上遇到了障碍。

问题如下:我有 2 个表:表 A:由“初始订单”组成。这是我们与客户的第一次接触。表B:由“二级订单”组成,即与初始订单相关的后续订单。

存在一对多的关系。表 A 具有以下列:

  • 订单号
  • 订购日期
  • 零件号
  • 客户ID

表 B 具有以下列:

  • 订单号
  • 订购日期
  • 零件号
  • 初始订单号

假设每个订单的数量始终为 1,但是对于 A 中的每个初始订单,我可以在 B 中有多行。

我现在要做的是合并这两个表,但我想要一个摘要,按 B 的零件编号,链接到 A。

数据看起来像这样 A:

 Order_Num  Order_date  Part_Num  Cust_ID 
       100    1/1/2013      1001     1111 
       101   1/15/2013      1002     1111 

乙:

 Order_Num  Order_date  Part_Num  Init_Order_Num 
       200    2/1/2013      2001             100 
       201   3/15/2013      2002             100 
       202   4/18/2013      2002             100 
       203    5/1/2013      2002             101 

最后我想看到的是这样的:

 Order_Num  Order_date  Part_Num  Cust_ID  Count_Part_2001  Count_Part_2002 
       100    1/1/2013      1001     1111                1                2 
       101   1/15/2013      1002     1111                1                 

我在这里查看了各种解决方案,包括使用 ddply、count、summarise、aggregate 等,但似乎都没有。该数据集有大约 260 万个初始订单和 40 万个二级订单。尝试使用 ddply,即使我将数据集减少到 1000 个二级订单仍然会导致内存不足错误(我的机器中有 16GB)。

在 SQL 中,我将使用计数(订单号),按次要上的零件号分组,然后将其与初始订单号上的初始订单表左连接(也将进行透视以创建“Count_Part_2001”和“Count_Part_2002”列。Pivot 的工作方式与 R 中的 melt() 命令相反)。

4

2 回答 2

1

如果您的变量以更具可比性的方式命名以进行合并,则会更容易。这是一个示例,说明如何继续merge以及aggregate我刚刚重命名变量的位置:

A <- structure(list(Ord_num_1 = c(100, 101), Ord_date_1 = c(" 1/1/2013   ", 
     " 1/15/2013  "), Part_num = c(1001, 1002), Cust_ID = c(1111,            
     1111)), .Names = c("Ord_num_1", "Ord_date_1", "Part_num", "Cust_ID"     
     ), row.names = 1:2, class = "data.frame")  

B <- structure(list(Ord_num_2 = c(200, 201, 202, 203), Ord_date_2 = c(" 2/1/2013   ",   
     " 3/15/2013  ", " 4/18/2013  ", " 5/1/2013   "), Part_num = c(2001,                 
     2002, 2002, 2002), Ord_num_1 = c(100, 100, 100, 101)), .Names = c("Ord_num_2",      
     "Ord_date_2", "Part_num", "Ord_num_1"), row.names = c(NA, 4L), class = "data.frame")

A 和 B 现在看起来像这样:

A
#   Ord_num_1   Ord_date_1 Part_num Cust_ID
# 1       100  1/1/2013        1001    1111
# 2       101  1/15/2013       1002    1111
B
#   Ord_num_2   Ord_date_2 Part_num Ord_num_1
# 1       200  2/1/2013        2001       100
# 2       201  3/15/2013       2002       100
# 3       202  4/18/2013       2002       100
# 4       203  5/1/2013        2002       101

让我们合并它们:

AB <- merge(A, B, by = "Ord_num_1")
#   Ord_num_1   Ord_date_1 Part_num.x Cust_ID Ord_num_2   Ord_date_2 Part_num.y
# 1       100  1/1/2013          1001    1111       200  2/1/2013          2001
# 2       100  1/1/2013          1001    1111       201  3/15/2013         2002
# 3       100  1/1/2013          1001    1111       202  4/18/2013         2002
# 4       101  1/15/2013         1002    1111       203  5/1/2013          2002

他们aggregate

aggregate(Part_num.x ~ Ord_num_1 + Ord_date_1 + Cust_ID + Part_num.y, AB, length)
#   Ord_num_1   Ord_date_1 Cust_ID Part_num.y Part_num.x
# 1       100  1/1/2013       1111       2001          1
# 2       100  1/1/2013       1111       2002          2
# 3       101  1/15/2013      1111       2002          1

正如@Joran 提到的,对于大数据,您应该探索该data.table包。这样,该方法非常相似:

library(data.table)
DTA <- data.table(A, key = "Ord_num_1") ## Important for merging
DTB <- data.table(B, key = "Ord_num_1")
DTM <- merge(DTA, DTB)
DTM[, length(Part_num.x), by = c("Ord_num_1", "Ord_date_1", "Cust_ID", "Part_num.y")]
#    Ord_num_1   Ord_date_1 Cust_ID Part_num.y V1
# 1:       100  1/1/2013       1111       2001  1
# 2:       100  1/1/2013       1111       2002  2
# 3:       101  1/15/2013      1111       2002  1

但是,正如您所见,这两种解决方案都是“长”格式。也就是说,我发现长格式通常更容易处理。

于 2013-05-30T21:06:01.677 回答
0

melt我对,dcastreshape函数有点幸运。这是基于您想要的最终结果,而不是完整的表合并。Ananda 能够从表 B 中捕获许多其他变量。我也不清楚 reshape 处理大型数据集的能力,因此内存问题可能仍然存在。

从 Ananda 的示例代码开始:

B <- B[,3:4]
B$count <- 1
B
#Part_num Ord_num_1 count
#1     2001       100     1
#2     2002       100     1
#3     2002       100     1
#4     2002       101     1
mB <- melt(B, id=c("Ord_num_1", "Part_num"))
#mB
#Ord_num_1 Part_num variable value
#1       100     2001    count     1
#2       100     2002    count     1
#3       100     2002    count     1
#4       101     2002    count     1
cB <- dcast(mB, Ord_num_1 + Part_num ~ variable, sum)
cB
#  Ord_num_1 Part_num count
#1       100     2001     1
#2       100     2002     2
#3       101     2002     1
reshape(cB, timevar = "Part_num", idvar = "Ord_num_1", direction = "wide")
#Ord_num_1 count.2001 count.2002
#1       100          1          2
#3       101         NA          1

然后可以使用Ord_num_1密钥将其合并到 A 中。我很想知道你能在 data.table 包中找到什么,我还没有尝试过。

于 2013-05-30T22:40:50.363 回答