Я думаю, что это делает трюк, он использует фильтрацию, а не агрегирование, чтобы сохранить минимум:
library(dplyr)
library(tidyr)
df %>%
gather(var, val, A, B, C) %>%
group_by(group, var) %>%
arrange(group, val) %>%
filter(row_number() == 1)
Если вы уверены, что никакое значение не повторится, это может сработать:
df %>%
gather(var, val, A, B, C) %>%
group_by(group, var) %>%
summarize(min_val = min(val),
id = max(ID * (val == min(val))))
Создается заново для получения нескольких строк, если есть связи:
set.seed(1)
df <- data.frame(ID = seq(1,9,1),
group = c(1,1,1,2,2,2,3,3,3),
A = sample(1:5, 9, replace = TRUE),
B = sample(1:5, 9, replace = TRUE),
C = sample(1:5, 9, replace = TRUE))
df %>%
gather(var, val, A, B, C) %>%
group_by(group, var) %>%
filter(val == max(val))
Измените max(val)
на min(val)
, если вы хотите, чтобы все строки имели минимальные значения.