【发布时间】: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。非常简单快速的数据操作。