library(dplyr) df %>% group_by(grp) %>% summarise(across(everything(), list(mean))) #> # A tibble: 3 x 5 #> grp a b c d #> <int> <dbl> <dbl> <dbl> <dbl> #> 1 1 3.08 2.98 2.98 2.91 #> 2 2 3.03 3.04 2.97 2.87 #> 3 3 2.85 2.95 2.95 3.06