В R вы можете использовать aggregate
функцию для вычисления сводной статистики для подмножеств данных. Эта функция очень похожа на tapply
функцию, но вы также можете ввести формулу или объект временного ряда, и, кроме того, результат имеет класс data.frame
. В этом руководстве вы узнаете, как использовать агрегатную функцию R с несколькими примерами для агрегирования строк по коэффициенту группировки.
Функция aggregate() в R
Синтаксис функции R aggregate
будет зависеть от входных данных. Существует три возможных типа входных данных: фрейм данных, формула и объект временного ряда. Аргументы и их описание для каждого метода обобщены в следующем блоке:
Синтаксис# Data frame
aggregate(x, # R object
by, # List of variables (grouping elements)
FUN, # Function to be applied for summary statistics
..., # Additional arguments to be passed to FUN
simplify = TRUE, # Whether to simplify results as much as possible or not
drop = TRUE) # Whether to drop unused combinations of grouping values or not.
# Formula
aggregate(formula, # Input formula
data, # List or data frame where the variables are stored
FUN, # Function to be applied for summary statistics
..., # Additional arguments to be passed to FUN
subset, # Observations to be used (optional)
na.action = na.omit) # How to deal with NA values
# Time series
aggregate(x, # Time series object
nfrequency = 1, # Observations per unit of time (submultiple of x)
FUN = sum, # Function to be applied for summary statistics
ndeltat = 1, # Fraction between successive observations
ts.eps = getOption("ts.eps"), # Tolerance to determine if 'nfrequency' is a submultiple of the frequency of x
...) # Additional arguments to be passed to FUN
Recall to type help(aggregate)
or ?aggregate
for additional information.
В следующих разделах мы покажем примеры и примеры использования агрегирования данных, такие как агрегирование среднего значения, количества или квантилей, среди других примеров. Использование aggregate
в R очень просто, и стоит упомянуть, что вы можете применить любую функцию, которую хотите, даже пользовательскую функцию.
Агрегированное среднее значение в R по группе
Рассмотрим, например, следующий набор данных, который содержит вес и тип корма образца цыплят:
df <- chickwts
head(df)
Вывод weight feed
179 horsebean
160 horsebean
136 horsebean
227 horsebean
217 horsebean
168 horsebean
Чтобы использовать aggregate
функцию для среднего значения в R, вам нужно будет указать числовую переменную в первом аргументе, категориальную (в виде списка) во втором и применяемую функцию (в данном случаеmean
) в третьем. Альтернативой является указание формулы вида: numerical ~ categorical
.
group_mean <- aggregate(df$weight, list(df$feed), mean)
group_mean <- aggregate(weight ~ feed, data = df, mean) # Equivalent
group_mean
Вывод Group.1 x
casein 323.5833
horsebean 160.2000
linseed 218.7500
meatmeal 276.9091
soybean 246.4286
sunflower 328.9167
Обратите внимание, что при использовании формулы группирующая переменная принудительно преобразуется в фактор. Следовательно, вы также можете использовать числовую переменную для представления групп.
Однако вы, возможно, заметили, что имена столбцов результирующего фрейма данных не представляют переменные. Чтобы изменить имена столбцов выходных данных, вы можете использовать colnames
функцию следующим образом:
colnames(group_mean) <- c("Group", "Mean")
group_mean
Вывод Group Mean
casein 323.5833
horsebean 160.2000
linseed 218.7500
meatmeal 276.9091
soybean 246.4286
sunflower 328.9167
Количество агрегатов
Иногда может быть полезно знать количество элементов каждой группы категориальной переменной. Хотя вы могли бы использовать table
функцию, если вы хотите, чтобы на выходе был фрейм данных, вы можете получить количество, к которому применяется length
функция aggregate
.
aggregate(chickwts$feed, by = list(chickwts$feed), FUN = length)
aggregate(feed ~ feed, data = chickwts, FUN = length) # Equivalent
Вывод Group.1 x
casein 12
horsebean 10
linseed 12
meatmeal 11
soybean 14
sunflower 12
Агрегированный квантиль
В этом разделе мы собираемся использовать объект временного ряда класса xts
в качестве примера, хотя вместо этого вы можете использовать фрейм данных для применения функции. Рассмотрим следующий пример объекта, который представляет ежемесячную доходность инвестиционного фонда за год:
Пример объекта xtsset.seed(1)
Dates <- seq(dmy("01/01/2014"), dmy("01/01/2015"), by = "day")
Return <- rnorm(length(Dates))
# install.packages("xts")
library(xts)
tserie <- xts(Return, Dates)
head(tserie)
Вывод [, 1]
2014-01-01 -0.6264538
2014-01-02 0.1836433
2014-01-03 -0.8356286
2014-01-04 1.5952808
2014-01-05 0.3295078
2014-01-06 -0.8204684
В этом сценарии вас может заинтересовать агрегирование квантилей по дате (например, агрегировать ежедневные данные с ежемесячными или еженедельными). Следовательно, вы можете вычислить квантили 5% и 95% для доходности каждого месяца.:
dat <- aggregate(tserie ~ month(index(tserie)), FUN = quantile,
probs = c(0.05, 0.95))
colnames(dat)[1] <- "Month"
dat
Вывод Month V1.5% V2.95%
1 -1.7041221 1.2301178
2 -0.9388331 1.7888182
3 -1.3886001 1.5261942
4 -1.0834517 1.5697239
5 -1.6527890 1.0883061
6 -1.4064641 2.1472166
7 -1.3117488 1.6377309
8 -1.8666917 1.1298708
9 -1.8513285 1.4615978
10 -1.0359233 1.7162873
11 -1.4453582 1.3389949
12 -2.0918996 1.5258865
Обратите внимание, что вы можете добавить дополнительные аргументы применяемой вами функции, разделяя их запятыми после FUN
аргумента.
Агрегировать по нескольким столбцам в R
Наконец, стоит упомянуть, что можно агрегировать более одной переменной. Для этой цели существует три варианта: агрегирование более чем одной категориальной переменной, агрегирование нескольких числовых переменных или обеих одновременно.
С одной стороны, мы собираемся создать новую категориальную переменную с именем cat_var
.
set.seed(1)
cat_var <- sample(c("A", "B", "C"), nrow(df), replace = TRUE)
df_2 <- cbind(df, cat_var)
head(df_2)
Вывод weight feed cat_var
179 horsebean A
160 horsebean C
136 horsebean A
227 horsebean B
217 horsebean A
168 horsebean C
Теперь вы можете использовать aggregate
функцию для агрегирования суммы для суммирования фрейма данных на основе двух переменных:
aggregate(df_2$weight, by = list(df_2$feed, df_2$cat_var), FUN = sum)
# Equivalent to:
aggregate(weight ~ feed + cat_var, data = df_2, FUN = sum)
Вывод feed cat_var weight
casein A 1005
horsebean A 532
linseed A 1079
meatmeal A 242
soybean A 1738
sunflower A 882
casein B 1131
horsebean B 494
linseed B 780
meatmeal B 2244
soybean B 1355
sunflower B 2109
casein C 1747
horsebean C 576
linseed C 766
meatmeal C 560
soybean C 357
sunflower C 956
Применяя aggregate
функцию к нескольким категориальным переменным, создаются все возможные комбинации между ними, и для каждой создается соответствующая статистическая сводка.
С другой стороны, мы собираемся создать новую числовую переменную с именем num_var
.
set.seed(1)
num_var <- rnorm(nrow(df))
df_3 <- cbind(num_var, df)
head(df_3)
Вывод num_var weight feed
-0.6264538 179 horsebean
0.1836433 160 horsebean
-0.8356286 136 horsebean
1.5952808 227 horsebean
0.3295078 217 horsebean
-0.8204684 168 horsebean
В этом сценарии при работе с двумя или более числовыми переменными вы можете использовать cbind
функцию для их объединения:
aggregate(cbind(df_3$num_var, df_3$weight), list(df_3$feed), mean)
Вывод Group.1 V1 V2
casein 0.4043795 323.5833
horsebean 0.1322028 160.2000
linseed 0.3491303 218.7500
meatmeal 0.2125804 276.9091
soybean -0.2314387 246.4286
sunflower 0.1651836 328.9167
Таким образом, статистическая сводка создается для числовых переменных на основе фактора.
Вы также можете применить функцию с несколькими числовыми и категориальными переменными. В этой ситуации было бы столько сводок, сколько числовых переменных, и столько групп, сколько возможных комбинаций.