首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于另一列更改ID值

问基于另一列更改ID值
EN

Stack Overflow用户
提问于 2018-02-21 21:44:18
回答 2查看 42关注 0票数 0

我有一个很大的数据集,看起来像这样:

代码语言:javascript
复制
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将会改变。所以我希望它看起来像这样:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-21 21:53:34

我认为data.table的rleid应该能做到这一点。这里有一个使用data.table和dplyr的解决方案

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

数据:

代码语言:javascript
复制
text <- "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"

df <- read.table(text = text, stringsAsFactors = FALSE, header = TRUE)
票数 1
EN

Stack Overflow用户

发布于 2018-02-21 22:00:08

可以使用一个简单的for循环:

代码语言:javascript
复制
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]
   }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48907515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档