если ваши данные большие и скорость имеет значение, я бы порекомендовал использовать R-строку функции R, которая намного быстрее.я применил 3 метода (f1 = aggregate, f2 = ddply, f3 = tapply), предложенных в ответах, чтобы сравнить его с f4 = rowum, и вот что я нахожу:
test replications elapsed relative
4 f4() 100 0.033 1.00
3 f3() 100 0.046 1.39
1 f1() 100 0.165 5.00
2 f2() 100 0.605 18.33
я добавил свой кодниже, если кто-то хочет исследовать более подробно.
library(plyr);
library(rbenchmark);
val = rnorm(50);
name = rep(letters[1:5], each = 10);
data = data.frame(val, name);
f1 = function(){aggregate(data$val, by=list(data$name), FUN=sum)}
f2 = function(){ddply(data, .(name), summarise, sum = sum(val))}
f3 = function(){tapply(data$val, data$name, sum)}
f4 = function(){rowsum(x = data$val, group = data$name)}
benchmark(f1(), f2(), f3(), f4(),
columns=c("test", "replications", "elapsed", "relative"),
order="relative", replications=100)