我是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的当前顺序,而我希望它只包含以前的订单。我该如何修改代码?任何答案都将受到高度赞赏。
答案 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