【问题标题】:Difficulty Grouping and Aggregating Large Dataset难以分组和聚合大型数据集
【发布时间】:2017-06-29 13:36:06
【问题描述】:

我在处理非常大的数据集时遇到了问题。我有一个项目 ID、购买日期和购买数量。

 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 ...

请注意,P=商品 ID,D=日期,Q=购买数量

我想按 3 天的时间计算每件商品的购买数量(因此可能仍有重复的商品 ID)。例如:

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

看起来像:

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)

但它出现了这个错误:

seq.int(0, to0 - from, by) 中的错误:“to”不能是 NA、NaN 或无限

另外:警告消息: 1: 在 min.default(c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, : min 没有不可缺少的参数;返回 Inf 2: 在 max.default(c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, : max 没有非缺失参数;返回 -Inf

我还想根据需要在其他时间段(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

提前谢谢你!

【问题讨论】:

  • 你试过 DPLYR 包了吗?
  • @AntonCH 不,我还没有 - 你会推荐什么?
  • @SuttonMurray 我想你在现实生活中的例子有超过 3 天。您想要滚动总和(每天计算)还是仅不重叠的 3 天周期?
  • @PLapointe 你是对的,肯定要多得多(总共一年和 100k+ 个采购订单)。我想获得为期三天的滚动总和,并且项目没有重叠。希望这是有道理的!
  • @SuttonMurray 阅读此rpubs.com/bradleyboehmke/data_wrangling。非常简单快速的数据操作。

标签: r aggregate odb


【解决方案1】:

下面是使用dplyr 的方法。请注意,我将您的示例延长了一天,以表明它可以处理额外的 3 天组。基本上,您想创建一个新的 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

【讨论】:

  • @P Lapoint 谢谢!它似乎运行良好,除了最后一列,它等于所有项目/日期 (2691020) 的总和,而不是每个时间段的总和。我将我的数据框命名为“POData”。我刚刚在原始帖子中粘贴了上面的新代码。有什么你可以看到可能导致它不能正确总计的吗?
  • @SuttonMurray 使用dplyr,您通常不需要将POData$ 放入代码中。在这种情况下,它告诉 R 忽略分组。试试这个:Output1 &lt;- POData%&gt;%mutate(Date=as.Date('PO Date',"%m-%d-%Y"),Date_Group=cut(Date,breaks="3 days"))%&gt;% group_by(ItemID,Date_Group)%&gt;%summarise(DateEndPoint=max(Date),Purchase_Q=sum(POQty,na.rm=TRUE))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
相关资源
最近更新 更多