根据另一列更改ID值

时间:2018-02-21 13:44:18

标签: r

我有一个大型数据集,如下所示:

Conv.  Rev.  ID  Order  path_no
 0     0     1    1        1
 1     50    1    2        1
 0     0     1    3        2
 1     100   1    4        2
 0     0     2    1        1
 0     0     2    2        1
 1     150   2    3        1
 1     100   2    4        2

我想基于何时有新的path_no创建一个新的ID列,然后ID将会改变。所以我希望它看起来像这样:

Conv.  Rev.  ID  Order  path_no
  0     0     1    1        1
  1     50    1    2        1
  0     0     2    3        2
  1     100   2    4        2
  0     0     3    1        1
  0     0     3    2        1
  1     150   3    3        1
  1     100   4    4        2

2 个答案:

答案 0 :(得分:1)

我认为来自rleid的{​​{1}}应该可以解决问题。这是一个使用data.tabledata.table的解决方案:

dplyr

或仅限dplyr::mutate(df, ID = data.table::rleid(path_no)) Conv. Rev. ID Order path_no 1 0 0 1 1 1 2 1 50 1 2 1 3 0 0 2 3 2 4 1 100 2 4 2 5 0 0 3 1 1 6 0 0 3 2 1 7 1 150 3 3 1 8 1 100 4 4 2

data.table

数据:

dt <- setDT(df)
dt[, ID := rleid(path_no)][]

   Conv. Rev. ID Order path_no
1:     0    0  1     1       1
2:     1   50  1     2       1
3:     0    0  2     3       2
4:     1  100  2     4       2
5:     0    0  3     1       1
6:     0    0  3     2       1
7:     1  150  3     3       1
8:     1  100  4     4       2

答案 1 :(得分:0)

可以进行简单的for循环:

vals <- c(1, 1, 1, 2, 2, 2, 1, 1, 2)
nobs <- length(vals)
idx <- rep(1, nobs)
for (i in 2:nobs) {
   if (vals[i] != vals[i-1]) {
       idx[i] <- idx[i-1] + 1
   } else {
       idx[i] <- idx[i-1]
   }
 }