После группировки по 'group' мы можем вычесть row_number из индекса, где 'reference' равен 1 (при условии, что в 'reference' для каждой 'group' есть только одно значение 1)
library(tidyverse)
df1 %>%
group_by(group) %>%
mutate(gidx = row_number() - which(reference == 1))
# or use which.max`
# mutate(gidx = row_number() - which.max(reference))
# A tibble: 10 x 5
# Groups: group [2]
# index item group reference gidx
# <int> <chr> <int> <int> <int>
# 1 1 a 0 0 -2
# 2 2 b 0 0 -1
# 3 3 c 0 1 0
# 4 4 d 0 0 1
# 5 5 e 0 0 2
# 6 6 f 1 0 -2
# 7 7 g 1 0 -1
# 8 8 h 1 1 0
# 9 9 i 1 0 1
#10 10 j 1 0 2
данные
df1 <- structure(list(index = 1:10, item = c("a", "b", "c", "d", "e",
"f", "g", "h", "i", "j"), group = c(0L, 0L, 0L, 0L, 0L, 1L, 1L,
1L, 1L, 1L), reference = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L,
0L)), class = "data.frame", row.names = c(NA, -10L))