Из кадра данных, есть простой способ агрегации ( sum
, mean
, max
одновременно с) и др несколько переменных?
Ниже приведены некоторые примеры данных:
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)
Любые предложения будут ценны.
recast
Функция (такжеreshape2
) интегрируетmelt
иdcast
функцию в одном ходе для таких задач , как это:recast(df1, year + month ~ variable, sum, id.var = c("date", "year", "month"))
Да, в вашем
formula
, вы можетеcbind
агрегировать числовые переменные:Смотрите
?aggregate
,formula
аргумент и примеры.источник
.
на LHS.aggregate(. ~ year + month, df1, sum, na.rm = TRUE)
, В этом примереsum
для «даты» не имеет смысла, хотя ....Использование
data.table
пакета, который является быстрым (полезно для больших наборов данных)https://github.com/Rdatatable/data.table/wiki
Использование пакета plyr
Использование summaze () из пакета Hmisc (в моем примере заголовки столбцов грязные)
источник
dt[, .(x1.sum = sum(x1), x2.sum = sum(x2), by = c(year, month)
?С
dplyr
пакетом, вы можете использоватьsummarise_all
,summarise_at
илиsummarise_if
функцию для объединения нескольких переменных одновременно. Для примера набора данных вы можете сделать это следующим образом:Результат последних двух вариантов:
Примечание:
summarise_each
не рекомендуется в пользуsummarise_all
,summarise_at
иsummarise_if
.Как упоминалось в моем комментарии выше , вы также можете использовать
recast
функцию изreshape2
-package:который даст вам тот же результат.
источник
Интересно,
aggregate
чтоdata.frame
метод base R здесь не показан, выше используется интерфейс формулы, поэтому для полноты:Более общее использование метода data.frame агрегата:
Так как мы предоставляем
data.frame
какx
иlist
(data.frame
также alist
) asby
, это очень полезно, если нам нужно использовать его динамически, например, использование других столбцов для агрегирования и агрегирования очень простоНапример вот так:
источник
С
devel
версиейdplyr
(version -‘0.8.99.9000’
) мы также можем использоватьsummarise
функцию для нескольких столбцов сacross
источник
Для более гибкого и более быстрого подхода к агрегации данных, проверить
collap
функцию в коллапсе R пакете , доступную на CRAN:Примечание : Вы можете использовать базовые функции, такие как
mean, max
и т. Д.collap
, Ноfmean, fmax
и т. Д. - это сгруппированные функции на основе C ++, предлагаемые в пакете свертывания , которые значительно быстрее (т. Е. Производительность при больших агрегациях данных такая же, как у data.table, но при этом обеспечивает большую гибкость и эти быстрые сгруппированные функции также можно использовать безcollap
).Примечание 2 :
collap
также поддерживает гибкое агрегирование данных нескольких типов, что, конечно, можно сделать с помощьюcustom
аргумента, но вы также можете применять функции к числовым и нечисловым столбцам полуавтоматическим способом:источник
Опоздал на вечеринку, но недавно нашел другой способ получить сводную статистику.
library(psych) describe(data)
Будет выводить: среднее, минимальное, максимальное, стандартное отклонение, n, стандартная ошибка, эксцесс, асимметрия, медиана и диапазон для каждой переменной.
источник
describe
ничего не делает по группам ...describe.by(column, group = grouped_column)
сгруппируем значения