Aggregate/Sum R 中按周和按产品设置的数据
Aggregate/Sum data set by week and by product in R
我有一个非常大的数据集,我想按 week/month 和产品(几千个)进行汇总。有没有办法使用以下格式的数据集来做到这一点?
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))
在 base R 中,您可以使用 as.Date
将字符 df$Date 转换为日期变量,然后使用 format
以正确的格式将日期转换为字符变量,指示每周约会。 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 在评论中提到的,data.table
类似于上述基本 R 代码的是
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
.
我有一个非常大的数据集,我想按 week/month 和产品(几千个)进行汇总。有没有办法使用以下格式的数据集来做到这一点?
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))
在 base R 中,您可以使用 as.Date
将字符 df$Date 转换为日期变量,然后使用 format
以正确的格式将日期转换为字符变量,指示每周约会。 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 在评论中提到的,data.table
类似于上述基本 R 代码的是
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
.