排除某些行的 Cumsum
Cumsum excluding some rows
我有一个问题链接到:
如何应用排除某个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,将只使用第一个元素”
我明白了为什么会出现这个错误,但我该如何避免呢?提前致谢。
您忘记减去 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
我有一个问题链接到:
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,将只使用第一个元素”
我明白了为什么会出现这个错误,但我该如何避免呢?提前致谢。
您忘记减去 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