Используя mydf
из вашего примера:
mydf <- data.frame(anim1, anim2, anim3)
Стек данных:
sdf <- stack(mydf)
Затем вычислите уникальные элементы, используя unique()
uni <- unique(sdf[, "values"])
и тогда они получат новый идентификатор животного
new_id <- as.numeric(as.factor(sort(uni)))
, который даст:
> new_id
[1] 1 2 3 4 5 6 7 8 9 10 11
Однако это совершенно тривиально;seq_along(uni)
доставит вас туда гораздо проще.Так что мне интересно, если вы хотите
newdf <- data.frame(anim = sort(uni), new_id = seq_along(uni))
merge(sdf, newdf, by.x = "values", by.y = "anim")
, который дает:
> merge(sdf, newdf, by.x = "values", by.y = "anim")
values ind new_id
1 1456 anim1 1
2 1456 anim1 1
3 2569 anim1 2
4 3215 anim3 3
5 4587 anim1 4
6 4587 anim3 4
7 5489 anim1 5
8 6531 anim2 6
9 6531 anim2 6
10 6548 anim3 7
11 6987 anim2 8
12 6987 anim2 8
13 7894 anim3 9
14 8542 anim3 10
15 15487 anim2 11
В вашем Вопросе есть некоторая двусмысленность, которую можно было бы смягчить, дав ожидаемый результат / вывод.