Агрегируйте ежедневные данные с помощью средств

У меня есть большой набор данных, как показано ниже, и я хочу преобразовать ежедневные данные в ежемесячные, имея средние значения total_cases_per_million и stringency_index.

head(datacovid)
 location                 date                         total_cases_per_million    stringency_index
 Afghanistan              24/02/2020                   0.026                      8.33
 Colombia                 25/02/2020                   0.026                      8.33
 Democratic Republic of Congo 26/02/2020               0.026                      8.33
 India                    27/02/2020                   0.026                      8.33
 Iraq                     28/02/2020                   0.026                      8.33
 Lebanon                  29/02/2020                   0.026                      8.33

Структура следующая:

str (datacovid) 'data.frame': 78444 набл. из 4 переменных: $ location: chr Афганистан Колумбия Демократическая Республика Конго Индия ... $ date: Фактор с 455 уровнями 01.01.2020, 01.01.2021, ..: 348 363 378 393 408 423 5 20 35 50 ... $ total_cases_per_million: число 0,026 0,026 0,026 0,026 0,026 0,026 0,026 0,026 0,051 0,103 ... $ stringency_index: число 8,33 8,33 8,33 8,33 8,33 ...

Я пытался использовать mutate, но потерпел неудачу. Спасибо заранее. P.S. Я очень новичок.


person Ümit Seven    schedule 31.03.2021    source источник


Ответы (2)


Главное, сгруппировать данные по month. Помогло бы преобразование переменной даты в тип даты.

df = read.table(text = r'{location                 date                         total_cases_per_million    stringency_index
 Afghanistan              24/02/2020                   0.026                      8.33
 Colombia                 25/02/2020                   0.026                      8.33
 'Democratic Republic of Congo' 26/02/2020               0.026                      8.33
 India                    27/02/2020                   0.026                      8.33
 Iraq                     28/02/2020                   0.026                      8.33
 Lebanon                  29/02/2020                   0.026                      8.33}', header=T)

df$date = as.Date(df$date, "%d/%m/%Y")
df$month  = format(df$date, "%b")
aggregate(cbind(total_cases_per_million, stringency_index) ~ month, df, mean)

# month total_cases_per_million stringency_index
# 1   Feb                   0.026             8.33
person Eyayaw    schedule 31.03.2021
comment
Большое спасибо, это работает! @Eyayaw B. - person Ümit Seven; 31.03.2021
comment
Рад, что помог. - person Eyayaw; 01.04.2021
comment
Пока я работаю над этим, после функций, которые вы выделяете, я не вижу названия стран @Eyayaw B. - person Ümit Seven; 01.04.2021
comment
скорректируйте код, добавив «location» в правой части формулы: ~ month + location. - person Eyayaw; 02.04.2021
comment
цените @Eyayaw, теперь это именно то, что я ищу. - person Ümit Seven; 02.04.2021

Вы можете легко сделать это, используя lubridate для преобразования столбца даты в формат даты и tidyverse для группировки и суммирования. Вот закомментированный код:

library(tidyverse)
library(lubridate)

df %>%
  # Transform date column into date format
  mutate_at(vars(date), function(x) dmy(as.character(x))) %>%
  # Extract month from date
  mutate(var_month = month(date)) %>%
  # Group by month
  group_by(var_month) %>%
  # Calculate the average for cases and stringency, grouped by month
  summarise(avg_monthly_cases = mean(total_cases_per_million),
            avg_stringency = mean(stringency_index))

# A tibble: 1 x 3
#  var_month avg_monthly_cases avg_stringency
#      <dbl>             <dbl>          <dbl>
#1         2             0.026           8.33
person Jonathan V. Solórzano    schedule 31.03.2021
comment
Большое спасибо @Jonathan. У меня есть предупреждающее сообщение ниже; Предупреждение: проблема с mutate() входом date. i Не удалось проанализировать все форматы. Форматы не найдены. i Ввод date равен (function (..., quiet = FALSE, tz = NULL, locale = Sys.getlocale("LC_TIME"), .... - person Ümit Seven; 31.03.2021
comment
Вероятно, это связано с тем, что дата указана как фактор (просто перечитайте свой пост). Я только что отредактировал ответ, чтобы преобразовать столбец даты в символ, прежде чем преобразовывать его в формат даты. - person Jonathan V. Solórzano; 31.03.2021
comment
Спасибо @Jonathan за уделенное время. Вероятно, это из-за меня, но мне не удалось это исправить. - person Ümit Seven; 31.03.2021