2016-11-24 37 views
0

我想在這個數據中添加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 

回答

1

有一個類似的概念@Psidom,但他打我cumsum一拳。這是一個dplyr解決方案。如果您想按客戶編號重新啓動ID,則在group_by中添加可爲您提供更大的靈活性。

df %>% 
    mutate(id = cumsum(c(TRUE, diff(receipt_id) != 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

假設你的數據幀已經被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

我們可以使用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)]