2016-11-24 6 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. Добавление в 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_ID и receipt_id, вы можете использовать cumsum на условный вектор где ИСТИНА указывает на позицию, необходимо создать новый идентификатор:

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)]