Cumsum不包括当前值

时间:2017-12-04 15:55:07

标签: r cumsum

我是R的新手,我正在尝试编写一个函数来累计对客户先前订购的商品进行求和。我已经在Stack Overflow上找到了一个几乎合适的代码示例,但我没有设法根据我的需要对其进行修改。

这是代码:

Fruits <- Fruits[order(Cars$order.id), ]  #sort data
Fruits$prev_Apples<-with(Fruits, 
    ave(
        ave(Apples, customer.id, FUN=cumsum),  #get running sum per customer.id
        interaction(customer.id, order.id, drop=T), 
    FUN=max, na.rm=T) #find largest sum per index per seg
)

这就是Fruits data.frame:

order.id   customer.id	Apples	 Peaches  Pears
1001	   J Car Ltd    	1   	0   	0
1002	    Som Comp    	0   	2   	0
1005	   Richardson   	0   	0   	1
1004	   J Car Ltd    	1   	0   	0
1003	   J Car Ltd    	2   	0   	0
1006	   Richardson   	1   	0   	1
1007	    Aldridge    	0   	0   	1
1008	   J Car Ltd    	0   	0   	1
1010	    Som Comp    	0   	1   	0
1009	   J Car Ltd	    1	    0	    0

这是我想要获得的:

order id	customer id	Apples	Peaches	Pears	Prev_Apples
1001	J Car Ltd	1	0	0	0
1002	Som Comp	0	2	0	0
1003	J Car Ltd	2	0	0	1
1004	J Car Ltd	1	0	0	3
1005	Richardson	0	0	1	0
1006	Richardson	1	0	1	0
1007	Aldridge	0	0	1	0
1008	J Car Ltd	0	0	1	4
1009	J Car Ltd	1	0	0	4
1010	Som Comp	0	1	0	0

这就是我实际得到的:

order id	customer id	Apples	Peaches	Pears	Prev_Apples
1001	J Car Ltd	1	0	0	1
1002	Som Comp	0	2	0	0
1003	J Car Ltd	2	0	0	3
1004	J Car Ltd	1	0	0	4
1005	Richardson	0	0	1	0
1006	Richardson	1	0	1	1
1007	Aldridge	0	0	1	0
1008	J Car Ltd	0	0	1	4
1009	J Car Ltd	1	0	0	5
1010	Som Comp	0	1	0	0

所以问题是cumsum还包括Apples的当前顺序,而我希望它只包含以前的订单。我该如何修改代码?任何答案都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

假设最后在注释中重复显示输入,我们将Fruits排序Cars,然后使用ave cumsum减去当前值来自Apples的{​​{1}}取消了总和中的最后一个值。

这给出了与问题中预期列出的答案相同的答案。

cumsum

,并提供:

Fruits <- Fruits[order(Fruits$order.id), ]
transform(Fruits, Prev_Apples = ave(Apples, customer.id, FUN = cumsum) - Apples)

注意:可重复形式的输入假定为:

   order.id customer.id Apples Peaches Pears Prev_Apples
1      1001   J Car Ltd      1       0     0           0
2      1002    Som Comp      0       2     0           0
5      1003   J Car Ltd      2       0     0           1
4      1004   J Car Ltd      1       0     0           3
3      1005  Richardson      0       0     1           0
6      1006  Richardson      1       0     1           0
7      1007    Aldridge      0       0     1           0
8      1008   J Car Ltd      0       0     1           4
10     1009   J Car Ltd      1       0     0           4
9      1010    Som Comp      0       1     0           0