colsum условия в R?

У меня есть эти данные, разделенные по неделям, и я хотел бы изменить их на ежемесячные и / или квартальные данные. Есть ли условие, которое я могу использовать для суммирования данных столбца по датам или неделям? Я не уверен, как это сделать, основываясь на неделях, учитывая, что у меня есть данные за 1962–2016 годы, и я не хочу объединять все недели. Ниже показано, как настроен мой фрейм данных, любые предложения приветствуются.

введите здесь описание изображения

Хорошо, это фильтруется по неделям, и у меня есть годы с 52 или 53 неделями. Предлагаемое решение, похоже, исправляет их, хотя некоторые даты являются датами окончания, а некоторые - падением в предыдущем году. Если я могу создать новый столбец по году и месяцу и суммировать значения столбцов в столбцах 7-13 (по столбцу, а не по строке)

введите здесь описание изображения


person ct957    schedule 03.04.2018    source источник
comment
Не могли бы вы показать, как будет выглядеть ваш результат, скажем, за январь и февраль 1962 года, например, для переменных pideaths?   -  person Frostic    schedule 03.04.2018
comment
Итак, скажем, ежеквартально это будет выглядеть примерно так: 1962 1 1962-01-06 1 MA Boston (сумма pideaths недель 1-13) и т. Д., А затем снова для 1962 2 (для квартала) и так далее.   -  person ct957    schedule 03.04.2018
comment
Думаю, мне все еще нужен пример, чтобы увидеть, как вы справляетесь с перекрывающимися неделями.   -  person Frostic    schedule 03.04.2018
comment
Да, жаль, что он добавил комментарий до того, как я закончил. Если нужно, я могу составить таблицу, чтобы лучше показать, что я пытаюсь сделать   -  person ct957    schedule 03.04.2018
comment
если вы предоставите результат dput(data,10), возможно, мы сможем вам помочь. И ответьте на вопрос @MaxFt.   -  person M--    schedule 03.04.2018
comment
Допустим, вы собираете ежемесячно. Рассмотрим 5-ю строку вашего набора данных: год 1962, дата окончания пятой недели 1962-02-03 (дата начала 1962-01-28). Считается ли эта линия за январь или февраль? Пропорция для обоих?   -  person Frostic    schedule 03.04.2018
comment
Даты - это даты окончания, так что да, вы правы.   -  person ct957    schedule 03.04.2018


Ответы (2)


library(dplyr)
# First create new variable for just the month and year
df$Month_Yr <- format(as.Date(df$Date), "%Y-%m")
# Then group by (dplyr) the months and sum over intended variable
df %>% group_by(Month_Yr) %>% summarise(sum_pideaths = sum(pideaths, na.rm = TRUE))

Примечание: это суммирует только столбец pideaths. Если вы хотите просуммировать все столбцы, сначала выберите числовые столбцы, а затем используйте summarise_all():

df %>% select(Month_Yr,**numeric_cols**) %>% group_by(Month_Yr) %>% summarise_all(funs(sum = sum(na.rm = TRUE)))
person jchaykow    schedule 03.04.2018
comment
Я создал новую переменную по месяцам и годам, но следующая строка меня смущает, поскольку она не суммируется. Влияет ли на эту функцию наличие символов и даты в других столбцах? - person ct957; 03.04.2018
comment
Это сработало, спасибо! Я также использовал приведенный ниже код, чтобы делать данные ежеквартально, и повторил процесс для суммирования данных. df $ Yr_Qt ‹- as.yearqtr (df $ Month_Yr, формат =% Y-% m) - person ct957; 04.04.2018

Функция as.POSIXlt предоставляет список, который может быть извлечен для получения числовых значений месяца, подобных C, поскольку они начинаются с 0 для января. Это не должно быть проблемой для разделения. См. Информацию о вариантах в разделе «Подробности», но я могу вам сказать, что ежеквартального варианта нет.

Вот код для доставки недель:

 as.POSIXlt( Sys.Date()+1:60 )$yday %/% 7
 [1] 13 13 13 13 13 14 14 14 14 14 14 14 15 15 15 15 15 15 15 16 16 16 16 16 16 16 17 17 17 17
[31] 17 17 17 18 18 18 18 18 18 18 19 19 19 19 19 19 19 20 20 20 20 20 20 20 21 21 21 21 21 21

Но обратите внимание, что это не обязательно будет соответствовать вашему выбору начала недели. Возможно, вам придется вычесть числовой день недели первого числа года, чтобы он правильно выровнялся. (Воскресенье - нулевой рабочий день.)

as.POSIXlt( Sys.Date()+1:60 - as.POSIXlt( as.Date( paste0( format(Sys.Date(), "%Y"),"-01-01")))$wday )$yday %/% 7
 [1] 13 13 13 13 13 13 14 14 14 14 14 14 14 15 15 15 15 15 15 15 16 16 16 16 16 16 16 17 17 17
[31] 17 17 17 17 18 18 18 18 18 18 18 19 19 19 19 19 19 19 20 20 20 20 20 20 20 21 21 21 21 21

Еще один вариант, позволяющий получить этикетку для печати, zoo::as.yearmon.

as.POSIXlt( Sys.Date()+1:60 )$mon
 [1] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
[46] 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5


zoo::as.yearmon( Sys.Date()+1:60 )
 [1] "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018"
 [9] "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018"
[17] "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018" "Apr 2018"
[25] "Apr 2018" "Apr 2018" "Apr 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018"
[33] "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018"
[41] "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018"
[49] "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018" "May 2018"
[57] "May 2018" "May 2018" "Jun 2018" "Jun 2018"

В пакете zoo также есть функция as.yearqtr:

 zoo::as.yearqtr( Sys.Date()+seq(0, 180, by=30) )
#[1] "2018 Q2" "2018 Q2" "2018 Q2" "2018 Q3" "2018 Q3" "2018 Q3" "2018 Q3"

«Под капотом» (или «капотом», в зависимости от случая) эта функция фактически также выдает числовые значения, но с классом, который имеет специальный метод печати:

 unclass( zoo::as.yearqtr( Sys.Date()+seq(0, 180, by=30) ) )
[1] 2018.25 2018.25 2018.25 2018.50 2018.50 2018.50 2018.50
person IRTFM    schedule 03.04.2018