如何用数据框R聚合多个月?

时间:2017-08-04 19:03:47

标签: r aggregate-functions

我需要将原始数据与R中的数据框合并多个月,例如:日期时间的数据框包括2017年和2018年。

function ExampleGraph() {
const xKey = this.props.x;
const yKey = this.props.y;
const xyData = data.map(r => ({x: r[xKey], y: r[yKey]}));
const xDomain = data.reduce((res, row) => {
    return {max: Math.max(res.max, row[xKey]), min: Math.min(res.min, row[xKey])};
}, {min: Infinity, max: -Infinity});

return (
<XYPlot
    xDomain={[xDomain.max, xDomain.min]}
    width={1000}
    height={640}>
      <HorizontalGridLines />
      <LineSeries data={xyData} />
      <XAxis />
      <YAxis />
    </XYPlot>
   )
}

我想要的是根据6个月的时间和类别求和:

        date category       amt
  1 2017-08-05        A 0.1900707
  2 2017-08-06        B 0.2661277
  3 2017-08-07        c 0.4763196
  4 2017-08-08        A 0.5183718
  5 2017-08-09        B 0.3021019
  6 2017-08-10        c 0.3393616  

我做了什么:     1.选择2017年的最后6个月,如明智的2018年     2.为每个子集添加一个新列以指示周期     3.再次组合2个子集     聚合 如下:

         period category       sum
1 2017_secondPeriod        A 25.00972
2  2018_firstPeriod        A 25.59850
3 2017_secondPeriod        B 24.96924
4  2018_firstPeriod        B 24.79649
5 2017_secondPeriod        c 20.17096
6  2018_firstPeriod        c 27.01794

我试图找出但不知道如何汇总多个月,例如3个月或6个月。

提前致谢 任何建议?

2 个答案:

答案 0 :(得分:1)

使用lubridate和tidyverse(dplyr&amp; magrittr)

首先,让我们使用Semesters,Quarter和&#34; Trimonthly&#34;创建小组。

library(tidyverse)
library(lubridate)

df <- df %>% mutate(Semester = semester(date, with_year = TRUE),
                    Quarter = quarter(date, with_year = TRUE),
                    Trimonthly = round_date(date, unit = "3 months" ))

Lubridate的学期()由semsters打破并给你1(1月至6月)或2(7月至8月); quarter()与宿舍做类似的事情。 我添加了第三个更基本的round_date函数,您可以在其中以大小和时间单位的形式指定时间范围。它产生了这种时间范围的第一个日期。我刻意将其命名为“Trimonthly&#34;所以你可以看到它与quarter()的比较

Pivot.Semester <- df %>% 
    group_by(Semester, category) %>% 
    summarise(Semester.sum = sum(amt))
Pivot.Quarter <- df %>% 
    group_by(Quarter, category) %>% 
    summarise(Quarter.sum = sum(amt))
Pivot.Trimonthly <- df %>%
    group_by(Trimonthly, category) %>%
    summarise(Trimonthly.sum = sum(amt))
Pivot.Semester
Pivot.Quarter
Pivot.Trimonthly

可选:如果要将汇总数据加入原始DF。

df <- df %>% left_join(Pivot.Semester, by = c("category", "Semester")) %>% 
    left_join(Pivot.Quarter, by = c("category", "Quarter")) %>% 
    left_join(Pivot.Trimonthly, by = c("category", "Trimonthly"))
df

答案 1 :(得分:0)

这是一个不使用包的3行解决方案。让k为一段时间内的月数。半年期间k为6.对于四分之一年期间,k将为3,等等。如果您想要一位数字,则将sprintf格式的02替换为1(但不是每月一次)因为那些必须是两位数)。如果您希望它与问题完全匹配,请进一步修改sprintf格式。

k <- 6
period <- with(as.POSIXlt(DF$date), sprintf("%d-%02d", year + 1900, (mon %/% k) + 1))
aggregate(amt ~ category + period, DF, sum)

,并提供:

  category  period       amt
1        A 2017-02 0.7084425
2        B 2017-02 0.5682296
3        c 2017-02 0.8156812

以使用一个软件包为代价,我们可以通过用以下方法之一替换period的公式来简化季度和月度计算:

library(zoo)

# quarterly
period <- as.yearqtr(DF$date)

# monthly
period <- as.yearmon(DF$date)

注意:可重复形式的输入是:

Lines <- "date category       amt
  1 2017-08-05        A 0.1900707
  2 2017-08-06        B 0.2661277
  3 2017-08-07        c 0.4763196
  4 2017-08-08        A 0.5183718
  5 2017-08-09        B 0.3021019
  6 2017-08-10        c 0.3393616"
DF <- read.table(text = Lines)
DF$date <- as.Date(DF$date)