如何通过对序列号进行分组来创建id变量?

时间:2016-11-24 23:39:28

标签: r database dplyr

我想在此数据中添加ID变量。如果receipt_ids是序列号,那么它们具有相同的ID。

CUST_NO_ID  receipt_id      dollar
  12         29             20.84
  12         30             20.21
  12         86             24.50
  12         87             20.68
  12        108             25.79
  12        109             24.93
  12        125             20.63
  12        126              9.90
  19        193             69.48
  19        194             46.88

这是我想要的结果

CUST_NO_ID  receipt_id      dollar       ID
  12         29             20.84        1
  12         30             20.21        1
  12         86             24.50        2
  12         87             20.68        2
  12        108             25.79        3
  12        109             24.93        3
  12        110             24.93        3
  12        125             20.63        4
  12        126              9.90        4
  19        193             69.48        5
  19        194             46.88        6

4 个答案:

答案 0 :(得分:2)

假设您的数据框已按CUST_NO_IDreceipt_id排序,您可以在条件向量上使用cumsum,其中TRUE表示应创建新ID的位置:

df$ID = cumsum(c(T, diff(df$receipt_id) != 1 | diff(df$CUST_NO_ID) != 0)))

df
#   CUST_NO_ID receipt_id dollar ID
#1          12         29  20.84  1
#2          12         30  20.21  1
#3          12         86  24.50  2
#4          12         87  20.68  2
#5          12        108  25.79  3
#6          12        109  24.93  3
#7          12        125  20.63  4
#8          12        126   9.90  4
#9          19        193  69.48  5
#10         19        194  46.88  5

答案 1 :(得分:1)

这样做

id <- 1

for(row in 1:nrow(data)){
  if(row == 1){
    dif <- 1
  }else{
    dif <- data[row,'receipt_id'] - data[row-1,'receipt_id']
  }

  if(dif != 1){
    id = id + 1
  }

  data[row,'ID'] = id
}

答案 2 :(得分:1)

与@Psidom有类似的概念,但他用cumsum击败了我。这是dplyr解决方案。如果您想按客户编号重新启动ID,则添加group_by可以为您提供更多灵活性。

df %>% 
  mutate(id = cumsum(c(TRUE, diff(receipt_id) != 1)))

答案 3 :(得分:1)

我们可以使用data.table

library(data.table)
setDT(df)[, id := cumsum(c(TRUE, diff(receipt_id)!=1))]

或使用shift

setDT(df)[, id := cumsum((receipt_id - shift(receipt_id, fill=receipt_id[1]))!=1)]