我制作了一个数据框,其中包含一列带有日期的列和一列带有数值的列。我希望此数据框按月份进行分组,并汇总每个相应月份来自其他列的所有数值。
这是我的数据框示例:
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
答案 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.date
是Date
类)
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