[英]Aggregate/Sum data set by week and by product in R
我有一個非常大的數據集,我想按周/月和按產品(數千個)進行匯總。 有沒有一種方法可以處理以下格式的數據集?
Date product product2 product3
03/03/2011 1 0 7
04/08/2011 3 8 2
03/05/2015 6 3 89
03/01/2017 1 0 2
03/03/2017 6 1 6
這將產生以下結果:
Date product product2 product3
wk1-032011 1 0 7
wk2-042011 3 8 2
wk1-032015 6 3 89
wk1-032017 7 1 8
df <- structure(list(Date = c("03/03/2011", "04/04/2011", "03/05/2015", "03/01/2017", "03/03/2017"),
product= c(1L, 3L, 6L, 1L, 6L),
product2= c(0L, 8L, 3L, 0L, 1L),
product3= c(7L, 2L, 89L, 2L, 6L)),
.Names= c("Date", "product", "product2", "product3"),
class= "data.frame", row.names=c(NA, -5L))
在基數R中,可以使用as.Date
將字符df $ Date轉換為Date變量,然后以正確的格式使用format
to將日期轉換為指示每周日期的字符變量。 然后,通過新變量,使用aggregate
來執行聚合。
aggregate(df[2:4], list("weeks"=format(as.Date(df$Date, "%m/%d/%Y"), "%Y-%W")), FUN=sum)
weeks product product2 product3
1 2011-09 1 0 7
2 2011-14 3 8 2
3 2015-09 6 3 89
4 2017-09 7 1 8
有關其他日期轉換,請參見?strptime
。
正如@akrun在評論中所提到的,與上面的基本R代碼類似的data.table
是
library(data.table)
setDT(df)[, lapply(.SD, sum),
by=.(weeks = format(as.IDate(Date, "%m/%d/%Y"), "%Y-%W"))]
在這里, setDT
將data.frame轉換為data.table, lapply...
計算總和,其中.SD
代表data.table。 該總和由被從所產生的每個獨特的元素計算format(as.IDate(Date, "%m/%d/%Y"), "%Y-%W")
其中所述轉換使用data.table的as.IDate
代替基本R as.Date
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.