La réponse fournie par rcs fonctionne et est simple. Toutefois, si vous gérez des jeux de données plus grandes et besoin d'un coup de pouce de la performance, il est une alternative plus rapide:
library(data.table)
data = data.table(Category=c("First","First","First","Second","Third", "Third", "Second"),
Frequency=c(10,15,5,2,14,20,3))
data[, sum(Frequency), by = Category]
# Category V1
# 1: First 30
# 2: Second 5
# 3: Third 34
system.time(data[, sum(Frequency), by = Category])
# user system elapsed
# 0.008 0.001 0.009
Comparons cela à la même chose en utilisant les données.cadre et ce qui précède ci-dessus:
data = data.frame(Category=c("First","First","First","Second","Third", "Third", "Second"),
Frequency=c(10,15,5,2,14,20,3))
system.time(aggregate(data$Frequency, by=list(Category=data$Category), FUN=sum))
# user system elapsed
# 0.008 0.000 0.015
Et si vous voulez garder la colonne c'est la syntaxe:
data[,list(Frequency=sum(Frequency)),by=Category]
# Category Frequency
# 1: First 30
# 2: Second 5
# 3: Third 34
La différence deviendra plus visible avec des ensembles de données plus importants, comme le code ci-dessous montre:
data = data.table(Category=rep(c("First", "Second", "Third"), 100000),
Frequency=rnorm(100000))
system.time(data[,sum(Frequency),by=Category])
# user system elapsed
# 0.055 0.004 0.059
data = data.frame(Category=rep(c("First", "Second", "Third"), 100000),
Frequency=rnorm(100000))
system.time(aggregate(data$Frequency, by=list(Category=data$Category), FUN=sum))
# user system elapsed
# 0.287 0.010 0.296
Pour plusieurs agrégations, vous pouvez combiner lapply
et .SD
comme suit
data[, lapply(.SD, sum), by = Category]
# Category Frequency
# 1: First 30
# 2: Second 5
# 3: Third 34
@AndrewMcKinlay, R utilise le tilde pour définir des formules symboliques, pour les statistiques et d'autres fonctions. Il peut être interprété comme * "Fréquence du modèle par catégorie" * ou * "Fréquence selon la catégorie" *.Toutes les langues n'utilisent pas un opérateur spécial pour définir une fonction symbolique, comme dans R ici. Peut-être avec cette «interprétation en langage naturel» de l'opérateur tilde, cela devient plus significatif (et même intuitif). Personnellement, je trouve cette représentation symbolique meilleure que certaines alternatives plus verbeuses. – r2evans