Cumsum排除了一些行

问题描述 投票:0回答:1

我有一个问题链接到: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个回答
0
投票

您忘记减去App​​les列的当前值。使用代码计算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
© www.soinside.com 2019 - 2024. All rights reserved.