1) dplyr / zoo Используя воспроизводимые в примечании данные в конце, преобразуйте каждую дату в класс yearmon, который представляет даты без дня, а затем суммируйте числовые столбцы:
library(dplyr)
library(zoo)
df %>%
group_by(yearmon = as.yearmon(capture.date)) %>%
summarize_if(is.numeric, sum) %>%
ungroup
дает этот тибл:
# 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
2) зоопарк Это можно сделать поочередно с помощью команды singhle read.zoo
. fortify.zoo
может быть использовано для результата, если вы хотите, чтобы в результате получился data.frame:
library(zoo)
read.zoo(df, FUN = as.yearmon, aggregate = sum)
, дающий эту серию зоопарка:
Test1 Test2 Test3
Mar 2016 3 3 3
Apr 2016 1 0 1
2a) зоопарк сТрубопровод magrittr Этот вариант можно записать как этот конвейер с конвейером magrittr (или dplyr):
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
3) Base R Используя только Base R, извлеките первые 7 символов каждой даты, а затем агрегируйте по ним:
df2 <- transform(df, year.month = substr(capture.date, 1, 7), capture.date = NULL)
aggregate(. ~ year.month, df2, sum)
, предоставив эти данные. Frame:
year.month Test1 Test2 Test3
1 2016-03 3 3 3
2 2016-04 1 0 1
Примечание
Ввод в воспроизводимой форме:
Lines <- "
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 <- read.table(text = Lines, header = TRUE, as.is = TRUE)