R:每月汇总行

时间:2019-11-03 12:49:05

标签: r dplyr aggregate

我制作了一个数据框,其中包含一列带有日期的列和一列带有数值的列。我希望此数据框按月份进行分组,并汇总每个相应月份来自其他列的所有数值。

这是我的数据框示例:

capture.date  Test1  Test2  Test3
2016-03-18      0      1      1
2016-03-18      1      1      1
2016-03-20      2      1      1
2016-04-12      1      0      1

我已经尝试了一些代码:

df %>% 
  group_by(capture.date) %>% 
  summarise_each(funs(sum))

和:

aggregate(df[2:4], by=df["capture.date"], sum)

,但是这两个选项都返回数据框,这些数据框按每日日期而不是月份进行汇总。如何使它按月而不是按天汇总?

所需的输出:

capture.date  Test1  Test2  Test3
2016-03         3      3      3     
2016-04         1      0      1

3 个答案:

答案 0 :(得分:3)

以下应该可以工作

library(lubridate)
library(tidyverse)

txt <- "capture.date  Test1  Test2  Test3
2016-03-18      0      1      1
2016-03-18      1      1      1
2016-03-20      2      1      1
2016-04-12      1      0      1"

data <- read.table(text = txt, header = TRUE)

data %>% 
  mutate(month = month(capture.date), 
         year = year(capture.date)) %>% 
  group_by(month, year) %>% 
  summarise_if(is.integer, sum) %>%
  ungroup %>%
  mutate("capture.date" = paste(year, str_pad(month, 2, side = "left", pad = "0"), sep = "-")) %>%
  select(capture.date, Test1, Test2, Test3)

这将产生

# A tibble: 2 x 4
  capture.date Test1 Test2 Test3
  <chr>        <int> <int> <int>
1 2016-03          3     3     3
2 2016-04          1     0     1

对于实际数据,您可能需要将summarise_if中的功能更改为is.integer以外的功能。

答案 1 :(得分:3)

1)dplyr / zoo 使用末尾注释中可重复显示的数据,将每个日期转换为yearmon类,该类表示没有日期的日期,然后汇总数字列:

@import url('https://fonts.googleapis.com/css?family=Poppins&display=swap');
@import url('https://fonts.googleapis.com/css?family=Asap');

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    height: 100vh;
}

.overlay {
    background: rgba(20, 20, 20, 0.4);
    height: 100%;
    align-items: center;
    justify-content: space-around;
    display: flex;
}
.disclaimer {
    background: white;
    opacity: 1 !important;
    width: 28%;
    height: 28%;
    align-items: center;
}

.heading-disclaimer {
    color: black !important;
    opacity: 1 !important;
    font-family: Poppins, sans-serif;
    width: 100%;
    z-index: auto;
    text-align: center;
}

.p-disclaimer {
    padding-top: 20px;
    font-size: 17px;
    z-index: auto;
    opacity: 1 !important;
    font-family: Asap;
    width: 100%;
    color: black !important;
    text-align: center;
}

给出这个小标题:

<div class="overlay">
            <!-- Roblox Version -->
            <div class="disclaimer">
                <h1 class="heading-disclaimer">Disclaimer</h1>
                <p class="p-disclaimer">
                    Disclaimer!
                </p>
                <button class="ok">OK</button>
            </div>
</div>

2)动物园这也可以通过单个library(dplyr) library(zoo) df %>% group_by(yearmon = as.yearmon(capture.date)) %>% summarize_if(is.numeric, sum) %>% ungroup 命令来完成。如果您想要data.frame作为结果,可以在结果上使用# A tibble: 2 x 4 yearmon Test1 Test2 Test3 <yearmon> <int> <int> <int> 1 Mar 2016 3 3 3 2 Apr 2016 1 0 1

read.zoo

给出这个动物园系列:

fortify.zoo

2a)带有magrittr管道的动物园这可以替换为带有magrittr(或dplyr)管道的该管道:

library(zoo)
read.zoo(df, FUN = as.yearmon, aggregate = sum)

或转换为data.frame

         Test1 Test2 Test3
Mar 2016     3     3     3
Apr 2016     1     0     1

3)Base R 仅使用Base R提取每个日期的前7个字符,然后对该日期进行汇总:

library(magrittr)
library(zoo)

df %>% read.zoo(FUN = as.yearmon, aggregate = sum)

提供此data.frame:

library(magrittr)
library(zoo)

df %>% read.zoo(FUN = as.yearmon, aggregate = sum) %>% fortify.zoo

注意

可复制形式的输入:

df2 <- transform(df, year.month = substr(capture.date, 1, 7), capture.date = NULL)
aggregate(. ~ year.month, df2, sum)

答案 2 :(得分:2)

您可以将日期提取为%Y-%m格式的group_by()格式,并使用summarise_if()summarise_at()选择要累加哪些变量。

(确认capture.dateDate类)

df %>%
  group_by(Date = strftime(capture.date, "%Y-%m")) %>%
  summarise_if(is.numeric, sum)

# # A tibble: 2 x 4
#   Date    Test1 Test2 Test3
#   <chr>   <int> <int> <int>
# 1 2016-03     3     3     3
# 2 2016-04     1     0     1
相关问题