【发布时间】:2017-12-04 15:55:07
【问题描述】:
我是 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 还包括苹果的当前订单,而我希望它只包括以前的订单。我应该如何修改代码?任何答案将不胜感激。
【问题讨论】:
-
我无法真正说出您的数据发生了什么 - 列中的空格。名字使它变得困难。你能和
dput()分享,所以它可以复制粘贴吗? (并且不要使用 sn-ps - 它们不适用于 R)。 -
看起来你想要一个
cumsum,其中第一项为 0,最后一项被省略。试试FUN = function(x) c(0, head(cumsum(x), -1)) -
非常感谢,这确实是我需要的!