2017-12-04 9 views
0

私は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 
 
)

そして、これは、果物のdata.frameです:

order.id customer.id \t Apples \t Peaches Pears 
 
1001 \t J Car Ltd  \t 1 \t 0 \t 0 
 
1002 \t  Som Comp  \t 0 \t 2 \t 0 
 
1005 \t Richardson \t 0 \t 0 \t 1 
 
1004 \t J Car Ltd  \t 1 \t 0 \t 0 
 
1003 \t J Car Ltd  \t 2 \t 0 \t 0 
 
1006 \t Richardson \t 1 \t 0 \t 1 
 
1007 \t  Aldridge  \t 0 \t 0 \t 1 
 
1008 \t J Car Ltd  \t 0 \t 0 \t 1 
 
1010 \t  Som Comp  \t 0 \t 1 \t 0 
 
1009 \t J Car Ltd \t  1 \t  0 \t  0

これは私がどうなるかであります取得したい:

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

そして、これは私が実際に得るものです:

order id \t customer id \t Apples \t Peaches \t Pears \t Prev_Apples 
 
1001 \t J Car Ltd \t 1 \t 0 \t 0 \t 1 
 
1002 \t Som Comp \t 0 \t 2 \t 0 \t 0 
 
1003 \t J Car Ltd \t 2 \t 0 \t 0 \t 3 
 
1004 \t J Car Ltd \t 1 \t 0 \t 0 \t 4 
 
1005 \t Richardson \t 0 \t 0 \t 1 \t 0 
 
1006 \t Richardson \t 1 \t 0 \t 1 \t 1 
 
1007 \t Aldridge \t 0 \t 0 \t 1 \t 0 
 
1008 \t J Car Ltd \t 0 \t 0 \t 1 \t 4 
 
1009 \t J Car Ltd \t 1 \t 0 \t 0 \t 5 
 
1010 \t Som Comp \t 0 \t 1 \t 0 \t 0

だから、問題はCUMSUMもの現在の順序が含まれていることですアップル、それ以前の注文だけを含めることを望みます。コードをどのように変更すればよいですか?どんな答えも高く評価されます。

+0

私は本当にあなたのデータで何が起こっているのかわかりません - 列のスペース。名前が難しい。 'dput()'と共有できますのでコピーペースト可能ですか? (また、スニペットを使わないでください - Rで動作しません)。 – Gregor

+0

最初の項が0で最後の項が省略されている 'cumsum'が必要なようです。 'FUN = function(x)c(0、head(cumsum(x)、-1))'を試してください。 – Gregor

+0

ありがとう、本当にありがとう! – gmt

答えて

0

和の最後の値をキャンセルcumsumからApplesの電流値を減算cumsumaveを使用し、我々は、ソートFruitsCarsに誤っ参照を固定端で注記再現示す入力を仮定すると。

これは、質問で予想されたものと同じ回答を返します。

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)) 
関連する問題