我在使用非常大的数据集时遇到问题。我有物品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)中的错误:&#39;到&#39;不能是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
提前谢谢!
答案 0 :(得分: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