Можно указать arrange
по «ID», «голосам» (либо в desc
конце или по возрастанию), сгруппировать по «ID» и получить diff
из первых двух «голосов»
library(dplyr)
df1 %>%
arrange(ID, desc(votes)) %>%
group_by(ID) %>%
summarise(margin = abs(diff(votes[1:2])))
# A tibble: 3 x 2
# ID margin
# <int> <int>
#1 1 20
#2 2 5
#3 3 10
Или другой вариант
df1 %>%
group_by(ID) %>%
summarise(margin = max(votes) - max(votes[-which.max(votes)]))
Или с slice
и diff
df1 %>%
group_by(ID) %>%
slice(row_number(votes)[1:2]) %>%
summarise(margin = diff(votes))
данные
df1 <- structure(list(ID = c(1L, 1L, 2L, 2L, 2L, 3L, 3L), votes = c(65L,
85L, 100L, 20L, 95L, 50L, 60L)), class = "data.frame", row.names = c(NA,
-7L))