【问题标题】:Cumsum excluding some rowsCumsum 不包括某些行
【发布时间】:2017-12-29 00:53:54
【问题描述】:

我有一个与以下问题相关的问题: Cumsum excluding current value 如何申请不包括某个customer.id的cumsum?例如:

order.id   customer.id  Apples   Peaches  Pears
1001       J Car Ltd        1       0       0
1002        Som Comp        1       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

我想应用 cumsum 来跟踪以前的苹果订单:

Fruits <- Fruits[order(Fruits$order.id), ]  #sort data
Fruits$prev_Apples<-with(Fruits, 
    ave(
        ave(Apples, customer.id, FUN=function(x) c(0, head(cumsum(x), -1))),  #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
)

但我也想从我的 cumsum customer.id Som Comp 中排除。对他来说,我希望 prev_Apples 列等于 0:

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

所以我想添加这行代码:

if(Fruits$customer id =='NULL'){
Prev_Apples = 0
return (Fruits$customer id)
}

但我当然会得到错误: “条件的长度 > 1,只使用第一个元素”

我明白我为什么会收到错误,但我该如何避免呢?提前致谢。

【问题讨论】:

    标签: r if-statement cumsum


    【解决方案1】:

    您忘记减去 Apples 列的当前值。使用代码计算 prev_Apples 后,以下代码应该可以工作。

    Fruits$prev_Apples <- Fruits$prev_Apples - Fruits$Apples
    Fruits[which(Fruits$customer.id == "Som Comp"), ]$prev_Apples <- 0
    #   order.id customer.id Apples Peaches Pears prev_Apples
    # 1     1001   J Car Ltd      1       0     0           0
    # 2     1002    Som Comp      1       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
    # 9     1010    Som Comp      0       1     0           0
    

    【讨论】:

    • 确实,我忘记了。现在我编辑了我的问题,顺便感谢您的正确回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2021-10-25
    • 2021-02-04
    • 2013-08-02
    • 2012-11-02
    相关资源
    最近更新 更多