Ответ, предоставленный rcs, работает и прост. Тем не менее, если вы регулируете большие массивы данных и необходимо повышение производительности есть более быстрый вариант:
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
Давайте сравним, что то же самое, используя данные.рама и выше выше:
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
И если вы хотите сохранить столбец это синтаксис:
data[,list(Frequency=sum(Frequency)),by=Category]
# Category Frequency
# 1: First 30
# 2: Second 5
# 3: Third 34
Разница становится более заметным с большими наборами данных, так как ниже код демонстрирует:
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
Для нескольких агрегатов, вы можете комбинировать lapply
и .SD
следующим
data[, lapply(.SD, sum), by = Category]
# Category Frequency
# 1: First 30
# 2: Second 5
# 3: Third 34
@AndrewMcKinlay, R использует тильду для определения символических формул, для статистики и других функций. Его можно интерпретировать как * «Модель по категориям» * или * «Частота в зависимости от категории» *.Не все языки используют специальный оператор для определения символической функции, как это сделано в R здесь. Возможно, с этой «интерпретацией на естественном языке» оператора тильды он становится более значимым (и даже интуитивным). Я лично считаю это символическое представление формул лучше, чем некоторые из более подробных альтернатив. – r2evans