A partir d' une trame de données, est - il un moyen facile d'agréger ( sum
, mean
, max
et c) de multiples variables simultanément?
Voici quelques exemples de données:
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)
Je voudrais agréger simultanément les variables x1
et x2
de la base de df2
données par année et par mois. Le code suivant agrège la x1
variable, mais est-il également possible d'agréger simultanément la x2
variable?
### aggregate variables by year month
df2=aggregate(x1 ~ year+month, data=df1, sum, na.rm=TRUE)
head(df2)
Toutes les suggestions seraient grandement appréciées.
recast
fonction (également dereshape2
) intègre la fonctionmelt
etdcast
en une seule fois pour des tâches comme celle-ci:recast(df1, year + month ~ variable, sum, id.var = c("date", "year", "month"))
Oui, dans votre
formula
, vous pouvezcbind
les variables numériques à agréger:Voir
?aggregate
, l'formula
argument et les exemples.la source
.
sur le LHS.aggregate(. ~ year + month, df1, sum, na.rm = TRUE)
. Dans cet exemple,sum
pour "date" n'a pas de sens cependant ...Utilisation du
data.table
package, qui est rapide (utile pour les ensembles de données plus volumineux)https://github.com/Rdatatable/data.table/wiki
Utilisation du package plyr
Utilisation de summary () du package Hmisc (les en-têtes de colonne sont cependant désordonnés dans mon exemple)
la source
dt[, .(x1.sum = sum(x1), x2.sum = sum(x2), by = c(year, month)
?Avec le
dplyr
package, vous pouvez utilisersummarise_all
,summarise_at
ou dessummarise_if
fonctions pour agréger plusieurs variables simultanément. Pour l'exemple d'ensemble de données, vous pouvez le faire comme suit:Le résultat de ces deux dernières options:
Remarque:
summarise_each
est obsolète au profit desummarise_all
,summarise_at
etsummarise_if
.Comme mentionné dans mon commentaire ci - dessus , vous pouvez également utiliser la
recast
fonction dureshape2
-package:ce qui vous donnera le même résultat.
la source
Fait intéressant,
aggregate
ladata.frame
méthode de la base R n'est pas présentée ici, au - dessus de l'interface de formule est utilisée, donc par souci d'exhaustivité:Utilisation plus générique de la méthode data.frame d'agrégat:
Puisque nous fournissons un
data.frame
commex
etlist
(data.frame
est aussi alist
) asby
, ceci est très utile si nous devons l'utiliser de manière dynamique, par exemple utiliser d'autres colonnes pour être agrégées et agrégées par est très simplePar exemple comme ceci:
la source
Avec la
devel
version dedplyr
(version -‘0.8.99.9000’
), nous pouvons également utilisersummarise
pour appliquer la fonction sur plusieurs colonnes avecacross
la source
Pour une approche plus flexible et plus rapide de l'agrégation de données, consultez la
collap
fonction du package collapse R disponible sur CRAN:Remarque : Vous pouvez utiliser les fonctions de base comme
mean, max
etc. aveccollap
, maisfmean, fmax
etc. sont C ++ Fonctions à base groupées offertes dans l' effondrement paquet qui sont beaucoup plus rapides ( à savoir les performances sur de grandes agrégations de données est le même que data.table tout en offrant une plus grande flexibilité, et ces fonctions groupées rapidement peuvent également être utilisées sanscollap
).Remarque 2 :
collap
prend également en charge l'agrégation de données multi-types flexible, ce que vous pouvez bien sûr faire à l'aide de l'custom
argument, mais vous pouvez également appliquer des fonctions aux colonnes numériques et non numériques de manière semi-automatisée:la source
En retard à la fête, mais a récemment trouvé un autre moyen d'obtenir les statistiques sommaires.
library(psych) describe(data)
Affiche: moyenne, min, max, écart type, n, erreur standard, kurtosis, asymétrie, médiane et plage pour chaque variable.
la source
describe
ne fait rien par groupe ...describe.by(column, group = grouped_column)
regroupera les valeurs