在mydataset中,日期格式的日期。我需要将它汇总到月份格式。 说清楚,这里是mydataset。
mydat
structure(list(date = structure(c(1L, 1L, 2L, 2L, 2L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L), .Label = c("12.01.2015", "13.01.2015",
"14.01.2015", "15.01.2015"), class = "factor"), Y = c(200L, 50L,
100L, 50L, 200L, 200L, 50L, 200L, 100L, 1000L, 1000L, 50L, 50L,
100L, 200L)), .Names = c("date", "Y"), class = "data.frame", row.names = c(NA,
-15L))
聚合必须是Y的总和。 在输出中我期望这种格式 01.2015 3550(2015年1月的Y变量之和) 02.2015 4000(2015年2月的Y变量之和)
怎么做? 我试着像Aggregate time series object by month R那样做,但它并没有帮助我。 怎么回事?
答案 0 :(得分:4)
以下是使用aggregate
的基本R解决方案:
with(mydat, aggregate(
Y,
list(month_year = format(as.POSIXct(date, format = "%d.%m.%Y"), "%m/%Y")),
sum))
# month_year x
#1 01/2015 3550
说明:从month_year
提取date
组件,并使用Y
在month_year
之后加aggregate
。
mydat <- structure(list(date = structure(c(1L, 1L, 2L, 2L, 2L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L), .Label = c("12.01.2015", "13.01.2015",
"14.01.2015", "15.01.2015"), class = "factor"), Y = c(200L, 50L,
100L, 50L, 200L, 200L, 50L, 200L, 100L, 1000L, 1000L, 50L, 50L,
100L, 200L)), .Names = c("date", "Y"), class = "data.frame", row.names = c(NA,
-15L))
答案 1 :(得分:3)
我们创建一个年份+月份的分组变量,然后执行sum
library(tidyverse)
library(zoo)
mydat %>%
group_by(yearMon = as.yearmon(dmy(date))) %>%
summarise(Y = sum(Y))
答案 2 :(得分:1)
1)data.frame 使用aggregate
和"yearmon"
类分组变量:
library(zoo)
fmt <- "%d.%m.%Y"
aggregate(mydat["Y"], list(Date = as.yearmon(mydat$date, fmt)), sum)
## Date Y
## 1 Jan 2015 3550
2)zoo 您可以考虑使用时间序列表示而不是数据框。这使得许多时间序列操作更容易。在这里,我们使用read.zoo
将mydat
转换为zoo对象。 fmt
来自上方。
library(zoo)
Y <- read.zoo(mydat, FUN = as.yearmon, format = fmt, aggregate = sum)
给这个动物园对象:
Y
## Jan 2015
## 3550
虽然不必要,但如果您想将其转换回数据框,请参阅?fortify.zoo
。
3)xts / zoo
转换为xts时间序列表示x
,然后使用aggregate.zoo
创建动物园对象z
。 fmt
来自上方。
library(xts) # also pulls in zoo
x <- xts(mydat["Y"], as.Date(mydat$date, fmt))
z <- aggregate(x, as.yearmon, sum)
z
##
## Jan 2015 3550