首页 > 解决方案 > R:每月汇总行数

问题描述

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

这是我的数据框示例:

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

标签: rdplyraggregate

解决方案


以下应该工作

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您的真实数据。


推荐阅读