根据该数据框内特定行的值向该数据框添加新列

时间:2018-10-15 13:37:41

标签: r dataframe data-cleaning

假设我有一个如下数据框

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 |
+------+------+

假设我要做的第一件事是计算出数据框中有多少个唯一ID值(由于所涉及的实际数据集的大小,这是必需的)

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

哪个给

[1] 1001 2001 2005 5000

我遇到的麻烦是,我想添加一个新列,例如“ new_id”,它查看数据框中的“ ID”值,并评估其在unique_ids中的位置,然后分配位置值(因此,“ new_id”由每一行的值组成,范围为1:length(unique_ids)

输出示例如下

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

我考虑过使用带if语句的for循环,但是我的第一次尝试并没有达到目标。虽然,如果我只想用一个顺序值替换“ ID”,则以下代码将起作用(但我遇到的困难是我想保留ID,但要添加另一个“ new_id”列)

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

感谢您的帮助。希望我已经尽可能清楚地说明了这个问题(尽管我很难说出一些问题,所以请让我知道是否有任何需要澄清的具体问题)

1 个答案:

答案 0 :(得分:0)

这更像是'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