Агрегировать / суммировать несколько переменных в группе (например, sum, mean)
из фрейма данных, есть ли простой способ агрегировать (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 фрейм данных по годам и месяцам. Следующий код вычисляет x1 переменная, но можно ли одновременно агрегировать x2 переменной?
### aggregate variables by year month
df2=aggregate(x1 ~ year+month, data=df1, sum, na.rm=TRUE)
head(df2)
любой предложения были бы весьма признательны.
5 ответов:
где это
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))
С , вы можете использовать
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 <dbl> <dbl> <dbl> <dbl> 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-пакет:library(reshape2) recast(df1, year + month ~ variable, sum, id.var = c("date", "year", "month")), который даст вам тот же результат.
опоздал на вечеринку, но недавно нашел еще один способ получить сводную статистику.
library(psych) describe(data)будет выводить: среднее, минимальное, максимальное, стандартное отклонение, n, Стандартная ошибка, эксцесс, асимметрия, медиана и диапазон для каждой переменной.
Comments