Перегруппировать несколько столбцов в наборе данных в один столбец, используя R - PullRequest
9 голосов
/ 13 сентября 2011

Я хотел бы объединить три столбца в одном из моих наборов данных в один с именем переменной «al_anim» и удалить любые дубликаты, ранжировать значения (идентификаторы животных) от минимального к максимальному и заново нумеровать каждое животное от 1 доN под именем переменной "new_id".

 anim1 <- c(1456,2569,5489,1456,4587)
 anim2 <- c(6531,6987,6987,15487,6531)
 anim3 <- c(4587,6548,7894,3215,8542)
 mydf <- data.frame(anim1,anim2,anim3)

Любая помощь будет принята с благодарностью!

Baz

1 Ответ

16 голосов
/ 13 сентября 2011

Используя 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

В вашем Вопросе есть некоторая двусмысленность, которую можно было бы смягчить, дав ожидаемый результат / вывод.

...