【问题标题】:Cumsum excluding current valueCumsum 不包括当前值
【发布时间】: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))
  • 非常感谢,这确实是我需要的!

标签: r cumsum


【解决方案1】:

假设输入在最后的注释中重复显示,我们对Fruits 进行排序,修复对Cars 的错误引用,然后使用avecumsumcumsum 中减去Apples 的当前值取消总和中的最后一个值。

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

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

注意:假设可重现形式的输入为:

Fruits <- structure(list(order.id = c(1001L, 1002L, 1005L, 1004L, 1003L, 
1006L, 1007L, 1008L, 1010L, 1009L), customer.id = structure(c(2L, 
4L, 3L, 2L, 2L, 3L, 1L, 2L, 4L, 2L), .Label = c("Aldridge", "J Car Ltd", 
"Richardson", "Som Comp"), class = "factor"), Apples = c(1L, 
0L, 0L, 1L, 2L, 1L, 0L, 0L, 0L, 1L), Peaches = c(0L, 2L, 0L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L), Pears = c(0L, 0L, 1L, 0L, 0L, 1L, 
1L, 1L, 0L, 0L)), .Names = c("order.id", "customer.id", "Apples", 
"Peaches", "Pears"), class = "data.frame", row.names = c(NA, 
-10L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2021-11-22
    • 2017-01-02
    • 1970-01-01
    • 2020-05-06
    • 2019-07-22
    相关资源
    最近更新 更多