Как агрегировать в R (R Studio) – aggregate()

В 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

Таким образом, статистическая сводка создается для числовых переменных на основе фактора.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *