Добавить новый столбец в фрейм данных на основе значений в определенных строках в этом фрейме данных

Предположим, у меня есть кадр данных, такой как ниже

people.dat <- data.frame("ID" = c(2001, 1001, 2005, 2001 5000), "Data" 
= c(100, 300, 500, 900, 200))

Что выглядит примерно так

+------+------+
|  ID  | Data |
+------+------+
| 2001 |  100 |
| 1001 |  300 |
| 2005 |  500 |
| 2001 |  900 |
| 5000 |  200 |
+------+------+

Предположим, первое, что я делаю, это вычисляю, сколько уникальных значений идентификатора находится в фрейме данных (это необходимо из-за размера рассматриваемого реального набора данных)

unique_ids <- sort(c(unique(people.dat$ID)))

Который дает

[1] 1001 2001 2005 5000

Где я застрял, так это в том, что я хотел бы добавить новый столбец, скажем, «new_id», который просматривает значение «ID» в кадре данных и оценивает его положение в unique_ids и присваивает позиционное значение (поэтому столбец «new_id» состоит значений в каждой строке в диапазоне от 1: длина (unique_ids)

Пример вывода будет следующим

+------+------+--------+
|  ID  | Data | new_id |
+------+------+--------+
| 2001 |  100 |   2    |
| 1001 |  300 |   1    |
| 2005 |  500 |   3    |
| 2001 |  900 |   1    |
| 5000 |  200 |   4    |
+------+------+--------+

Я думал об использовании цикла for с операторами if, но мои первые попытки не совсем увенчались успехом. Хотя, если бы я просто хотел заменить «ID» последовательным значением, следующий код работал бы (но я застрял в том, что хочу сохранить ID, но добавить еще один столбец «new_id»)

for (i in 1:48){
  people.dat$ID[people.dat$ID == unique_ids[i]] <- i
}

Спасибо за любую помощь. Надеюсь, я максимально ясно изложил вопрос (хотя я изо всех сил пытался сформулировать некоторые из них, поэтому, пожалуйста, дайте мне знать, если есть что-то конкретное, что требует уточнения)


person Community    schedule 15.10.2018    source источник
comment
Спасибо, работает отлично. Извините за дубликат, я не мог найти нужных слов, чтобы описать свою проблему, поэтому изо всех сил пытался найти другой пост при поиске.   -  person    schedule 15.10.2018


Ответы (1)


Это больше похоже на 'rank' проблему

people$rank=as.numeric(factor(people$ID))
people
    ID Data rank
1 2001  100    2
2 1001  300    1
3 2005  500    3
4 2001  900    2
5 5000  200    4
person BENY    schedule 15.10.2018
comment
почему даже rank? as.numeric(factor(people.dat$ID)) дает тот же результат. - person Ronak Shah; 15.10.2018
comment
@RonakShah да, ты прав - person BENY; 15.10.2018