2017-06-29 9 views
0

非常に大きなデータセットを扱う際に問題があります。商品ID、購入日、購入数量があります。メモ、P =アイテムID、D =日付、及びQ =購入数量として大きなデータセットをグループ化して集約するのが難しい

str(Output0) 
'data.frame': 183847 obs. of 3 variables: 
    $ D: Factor w/ 460 levels "2015-09-21","2015-09-24",..: 3 3 3 3 3 3 3 3 3 3 ... 
    $ P: int 1 2 3 4 5 6 7 8 9 10 ... 
    $ Q: num 7 1 2 1 1 1 1 1 1 1 ... 

Iは、3日間の期間により各アイテムの購入数量を合計したい(SO存在してもよいであろうアイテムIDが重複していることがあります)。例えば:私が使用して試した

ItemID DateEndPoint Purchase Q 
1234  1/1/16   1 
1235  1/3/16   3 
1444  1/3/16   3 

Output2 <- aggregate(Output0$Q, by=list(PS=P, 
       Date = cut(as.Date(Output0$D, format="%d/%m/%Y"),breaks="3 day")), FUN=sum) 

が、それは、このエラーを考え出すされています

Error in seq.int(0, to0 - from, by) : 'to' cannot be NA, NaN or infinite

In addition: Warning messages: 1: In min.default(c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, : no non-missing arguments to min; returning Inf 2: In max.default(c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, : no non-missing arguments to max; returning -Inf

P Date  Purchase Q 
1234  1/1/16   1 
1235  1/1/16   1 
1235  1/2/16   1 
1235  1/3/16   1 
1444  1/1/16   1 
1444  1/2/16   1 
1444  1/3/16   1 

は次のようになります。私はまた、他の期間についても同じことをしたいと思います。必要(1日、1週間)なので、再生可能なものはすばらしいでしょう。 P Lapointeに対応して

:それはのように表示される最後の列は、すべての日付間のすべての項目を合計する代わりに、各期間のしていることを

Output1 <- POData%>%mutate(Date=as.Date(POData$`PO Date`,"%m-%d-%Y"),Date_Group=cut(Date,breaks="3 days"))%>% group_by(POData$`ItemID`,Date_Group)%>%summarise(DateEndPoint=max(Date),Purchase_Q=sum(POData$`POQty`,na.rm=TRUE)) 

除いて、私は以下試した、それは偉大に見えます

> View(Output1) 
> str(Output1) 
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 116749 obs. of 4 variables: 
    $ POData$`Item ID`: int 11 11 11 11 11 11 11 11 11 11 ... 
    $ Date_Group  : Factor w/ 216 levels "2015-09-21","2015-09-24",..: 4 6 11 13 14 15 18 19 24 25 ... 
    $ DateEndPoint : Date, format: "2015-10-02" "2015-10-08" ... 
    $ Purchase_Q  : num 2691020 2691020 2691020 2691020 2691020 ... 
    - attr(*, "vars")= chr "POData$`Item ID`" 
    - attr(*, "drop")= logi TRUE 

ありがとうございます!

+1

DPLYRパッケージを試しましたか? – AntonCH

+0

@AntonCHいいえ私はまだしていません - 何をお勧めしますか? –

+0

@SuttonMurray私はあなたの実生活の例で3日以上を持っていると思います。合計金額(毎日計算)または3日間の期間が重複しないようにしたいですか? –

答えて

1

dplyrでこれを行う方法は次のとおりです。 3日間の追加のグループを処理できることを示すために、例を1日延長しました。基本的に、グループ化する新しいDate_group列を作成する必要があります。次に、summarise

df <- read.table(text="P Date  Purchase_Q 
1234  1/1/16   1 
1235  1/1/16   1 
1235  1/2/16   1 
1235  1/3/16   1 
1444  1/1/16   1 
1444  1/2/16   1 
1444  1/3/16   1 
1444  1/5/16   1",header=TRUE,stringsAsFactors=FALSE) 

library(dplyr) 
df%>% 
    mutate(Date=as.Date(Date,"%m/%d/%y"),Date_group=cut(Date,breaks="3 days")) %>% 
    group_by(P,Date_group) %>% 
    summarise(DateEndPoint=max(Date),Purchase_Q=sum(Purchase_Q,na.rm=TRUE)) 

     P Date_group DateEndPoint Purchase_Q 
    <int>  <fctr>  <date>  <int> 
1 1234 2016-01-01 2016-01-01   1 
2 1235 2016-01-01 2016-01-03   3 
3 1444 2016-01-01 2016-01-03   3 
4 1444 2016-01-04 2016-01-05   1 
+0

@P Lapointありがとう!最後の列を除いて、うまくいっているようです。これは、各期間の代わりに、すべてのアイテム/日付(2691020)の合計に等しくなります。私は私のデータフレーム "POData"の名前を付けます。私はちょうど元の投稿の上に新しいコードを貼り付けました。あなたが見ることができますが、それが正しく合計しない原因となるものはありますか? –

+0

@SuttonMurray 'dplyr'では、通常、' POData $ 'をコードの中に入れる必要はありません。この場合、Rはグループ化を無視します。代わりに、これを試してみてください: 'Output1 <- POData%>%mutate(Date = as.Date( 'PO Date、%m-%d-%Y')、Date_Group = cut(Date、breaks =" 3 days "))%>% (PQQty、na.rm = TRUE)) –

+0

@P Lapointe - それがうまくいった!あなたは素晴らしいです! :) –

関連する問題