Совокупность / суммирование нескольких переменных для каждой группы (например, сумма, среднее значение)

Из фрейма данных существует ли простой способ одновременного агрегирования ( sum , mean , max et c) нескольких переменных?

Ниже приведены некоторые примеры данных:

 library(lubridate) days = 365*2 date = seq(as.Date("2000-01-01"), length = days, by = "day") year = year(date) month = month(date) x1 = cumsum(rnorm(days, 0.05)) x2 = cumsum(rnorm(days, 0.05)) df1 = data.frame(date, year, month, x1, x2) 

Я хотел бы одновременно агрегировать переменные x1 и x2 из df2 данных df2 в df2 от года и месяца. Следующий код агрегирует переменную x1 , но можно ли одновременно агрегировать переменную x2 ?

 ### aggregate variables by year month df2=aggregate(x1 ~ year+month, data=df1, sum, na.rm=TRUE) head(df2) 

Любые предложения будут ценны.

Где находится функция this year() ?

Вы также можете использовать пакет reshape2 для этой задачи:

 require(reshape2) df_melt <- melt(df1, id = c("date", "year", "month")) dcast(df_melt, year + month ~ variable, sum) # year month x1 x2 1 2000 1 -80.83405 -224.9540159 2 2000 2 -223.76331 -288.2418017 3 2000 3 -188.83930 -481.5601913 4 2000 4 -197.47797 -473.7137420 5 2000 5 -259.07928 -372.4563522 

Да, в вашей formula вы можете cbind числовые переменные, которые будут агрегированы:

 aggregate(cbind(x1, x2) ~ year + month, data = df1, sum, na.rm = TRUE) year month x1 x2 1 2000 1 7.862002 -7.469298 2 2001 1 276.758209 474.384252 3 2000 2 13.122369 -128.122613 ... 23 2000 12 63.436507 449.794454 24 2001 12 999.472226 922.726589 

См. « ?aggregate , аргумент formula и примеры.

Используя пакет data.table , который быстро (полезен для больших наборов данных)

https://github.com/Rdatatable/data.table/wiki

 library(data.table) df2 <- setDT(df1)[, lapply(.SD, sum), by=.(year, month), .SDcols=c("x1","x2")] setDF(df2) # convert back to dataframe 

Использование пакета plyr

 require(plyr) df2 <- ddply(df1, c("year", "month"), function(x) colSums(x[c("x1", "x2")])) 

Использование summary () из пакета Hmisc (заголовки столбцов в моем примере беспорядочны)

 # need to detach plyr because plyr and Hmisc both have a summarize() detach(package:plyr) require(Hmisc) df2 <- with(df1, summarize( cbind(x1, x2), by=llist(year, month), FUN=colSums)) 

С пакетом dplyr вы можете использовать функции summarise_all , summarise_at или summarise_if для объединения нескольких переменных одновременно. Для примера набора данных вы можете сделать это следующим образом:

 library(dplyr) # summarising all non-grouping variables df2 <- df1 %>% group_by(year, month) %>% summarise_all(sum) # summarising a specific set of non-grouping variables df2 <- df1 %>% group_by(year, month) %>% summarise_at(vars(x1, x2), sum) df2 <- df1 %>% group_by(year, month) %>% summarise_at(vars(-date), sum) # summarising a specific set of non-grouping variables based on condition (class) df2 <- df1 %>% group_by(year, month) %>% summarise_if(is.numeric, sum) 

Результат последних двух вариантов:

  year month x1 x2     1 2000 1 -73.58134 -92.78595 2 2000 2 -57.81334 -152.36983 3 2000 3 122.68758 153.55243 4 2000 4 450.24980 285.56374 5 2000 5 678.37867 384.42888 6 2000 6 792.68696 530.28694 7 2000 7 908.58795 452.31222 8 2000 8 710.69928 719.35225 9 2000 9 725.06079 914.93687 10 2000 10 770.60304 863.39337 # ... with 14 more rows 

Примечание: summarise_each устарел в пользу summarise_all , summarise_at и summarise_if .


Как уже упоминалось в моем комментарии выше , вы также можете использовать функцию reshape2 из reshape2 :

 library(reshape2) recast(df1, year + month ~ variable, sum, id.var = c("date", "year", "month")) 

который даст вам тот же результат.

Поздно к партии, но недавно нашел другой способ получить сводную статистику.

library(psych) describe(data)

Будет выводиться: среднее, мин, макс, стандартное отклонение, n, стандартная ошибка, эксцесс, асимметрия, медиана и диапазон для каждой переменной.

  • Что означает «Следующий объект замаскирован из« package: xxx »?
  • Отобразить точное значение переменной в R
  • Проблема при передаче переменной с обозначением знака доллара ($) на aes () в сочетании с facet_grid () или facet_wrap ()
  • Подсчет уникальных / отдельных значений по группам в кадре данных
  • Как получить среднюю, среднюю и другую статистику по всей матрице, массиву или файлу данных?
  • Найдите день недели
  • Многострочные методы обхода комментариев?
  • Раунд вверх от .5
  • Вставка двух векторов с комбинациями всех элементов векторов
  • Как эффективно фильтровать фрейм данных?
  • Преобразование года и месяца (формат «yyyy-mm») на дату?
  • Interesting Posts

    Получение чей-то инвентаря Steam

    Как вы вызываете msdeploy из powershell, когда параметры имеют пробелы?

    Swagger mock server

    Насколько гибкими / сложными являются типы столбцов SQLite?

    почему byte + = 1 компилировать, но byte = byte + 1 нет?

    Один или несколько ресурсов имеют цель «голова», но не «головной» компонент был определен в представлении

    Одна таблица Mysql с несколькими столбцами TIMESTAMP

    Hibernate – однонаправленная связь для многих – почему таблица соединения лучше?

    Как доверенный корневой сертификат появляется в списке доверенных корней?

    Как записывать экран и делать скриншоты с помощью Android API?

    System.Net.WebClient неоправданно медленный

    Каков самый код EVIL, который вы когда-либо видели в среде производственного предприятия?

    заменить специальные символы в строке в java

    Json.NET добавляет обратную косую черту при возврате сериализованной строки json

    Выполнение static_assert, что тип шаблона является другим шаблоном

    Давайте будем гением компьютера.