Вот решение, использующее split () для разделения фрейма данных на список фреймов данных, один элемент списка (фрейм данных) на уровень V2, а затем отдельные функции lapply для создания сводок с требуемой функцией агрегирования.Наконец объедините все вместе, используя Reduce и rbind
df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "797 Fleet", class = "factor"),
V2 = structure(c(5L, 1L, 4L, 3L, 2L, 5L, 1L, 4L, 3L, 2L,
5L, 1L, 4L, 3L, 2L, 5L), .Label = c("Available Hours", "Cycle Time",
"Performance", "Production time", "Units"), class = "factor"),
V3 = c(51, 2989.601111, 2498.85, 540.8754973, 39.93337086,
52, 30010.73389, 24946.62833, 529.4659407, 40.81742793, 36,
20778.5525, 17174.18722, 535.7960907, 40.36234152, 19)), .Names = c("V1",
"V2", "V3"), class = "data.frame", row.names = c(NA, -16L))
df_list <- split(df, df$V2)
summary <- c(
lapply(df_list[c("Units", "Production time")],
function(df) {aggregate(V3 ~ V1 + V2, data = df, sum)})
,
lapply(df_list[c("Performance", "Cycle Time")],
function(df) {aggregate(V3 ~ V1 + V2, data = df, mean)})
)
Reduce(rbind, summary)
#> V1 V2 V3
#> 1 797 Fleet Units 158.00000
#> 2 797 Fleet Production time 44619.66555
#> 3 797 Fleet Performance 535.37918
#> 4 797 Fleet Cycle Time 40.37105