Odpowiedź udzielona przez rcs działa i jest prosta. Jednakże, jeśli są obsługi większych zbiorów danych i potrzebują wzrost wydajności jest szybsza alternatywa:
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
Porównajmy to do tego samego z wykorzystaniem danych.Rama i powyżej powyżej:
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
A jeśli chcesz zachować kolumnę to jest składnia:
data[,list(Frequency=sum(Frequency)),by=Category]
# Category Frequency
# 1: First 30
# 2: Second 5
# 3: Third 34
Różnica staną się bardziej widoczne z większych zbiorów danych, jak poniżej kod demonstruje:
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
Dla wielu skupisk, można połączyć lapply
i .SD
następująco
data[, lapply(.SD, sum), by = Category]
# Category Frequency
# 1: First 30
# 2: Second 5
# 3: Third 34
@AndrewMcKinlay, R używa tyldy do definiowania formuł symbolicznych, dla statystyk i innych funkcji. Może być interpretowany jako * "model Częstotliwość według kategorii" * lub * "Częstotliwość w zależności od kategorii" *.Nie wszystkie języki używają specjalnego operatora do zdefiniowania funkcji symbolicznej, jak to zrobiono w R tutaj. Być może dzięki tej "naturalno-językowej interpretacji" operatora tyldy staje się ona bardziej znacząca (a nawet intuicyjna). Osobiście uważam, że ta symboliczna reprezentacja formuły jest lepsza niż niektóre bardziej szczegółowe alternatywy. – r2evans