using plyr
require(plyr) set.seed(45) df <- data.frame(year=sample(2000:2012, 25, replace=T), score=sample(25)) ddply(df, .(year), summarise, max.score=max(score))
using data.table
require(data.table) dt <- data.table(df, key="year") dt[, list(max.score=max(score)), by=year]
using aggregate :
o <- aggregate(df$score, list(df$year) , max) names(o) <- c("year", "max.score")
using ave :
df1 <- df df1$max.score <- ave(df1$score, df1$year, FUN=max) df1 <- df1[!duplicated(df1$year), ]
Edit: In the case of more columns, a data.table solution would be better (my opinion :))
set.seed(45) df <- data.frame(year=sample(2000:2012, 25, replace=T), score=sample(25), alpha = sample(letters[1:5], 25, replace=T), beta=rnorm(25))
source share