Another way is to use a for loop:
DF<-data.frame(Category=c("A","B","C","A","C"), Value=c(5,2,3,1,1)) DF2<-data.frame(Category=unique(DF$Category)) for(letter in unique(DF$Category)) { DF3<-DF[DF$Category!=letter,] DF2$avg[DF2$Category==letter]<-round(mean(DF3$Value),2) } DF2 Category avg 1 A 2.00 2 B 2.50 3 C 2.67
source share