我想在此数据中添加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
答案 0 :(得分:2)
假设您的数据框已按CUST_NO_ID
和receipt_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)]