Один из вариантов использования setdiff
- игнорировать текущий индекс (row_number()
) и выбрать score
из оставшегося индекса.
library(dplyr)
library(purrr)
df %>%
group_by(class_id) %>%
mutate(other = score[map_dbl(seq_len(n()), ~setdiff(seq_len(n()), .))])
# class_id student score other_score
# <int> <int> <int> <int>
#1 1 23 87 93
#2 1 27 93 87
#3 2 14 77 90
#4 2 19 90 77
Если у вас более двух значений в каждом class_id
, используйте
setdiff(seq_len(n()), .)[1])])
, который выберет только одно значение или вы также можете сделать
sample(setdiff(seq_len(n()), .))[1])])
для случайного выбора одного значения из оставшихся score
.