2015-03-07 10 views
5

Załóżmy, że mam dane, które wygląda następująco:Czy istnieje sposób w data.table do przypisania identyfikatorów według grupy na podstawie identyfikatora?

Name  Date 
Bank1  1/1/2005 
Bank1  6/1/2005 
Bank1  1/1/2006 
Bank1  6/1/2006 
Bank1  1/1/2007 
Bank2  6/1/2006 
Bank2  1/1/2007 
Bank3  6/1/2005 
Bank3  1/1/2006 
Bank3  6/1/2006 
Bank3  1/1/2007 
.... 

Oto pierwsza data to 1.01.2005, a ostatni jest 01.01.2007. Chciałbym przypisać identyfikator tak, że mam:

Name  Date   ID 
Bank1  1/1/2005  1 
Bank1  6/1/2005  2 
Bank1  1/1/2006  3 
Bank1  6/1/2006  4 
Bank1  1/1/2007  5 
Bank2  6/1/2006  4 
Bank2  1/1/2007  5 
Bank3  6/1/2005  2 
Bank3  1/1/2006  3 
Bank3  6/1/2006  4 
Bank3  1/1/2007  5 
.... 

Chcę zasadniczo przypisać identyfikator datą odpowiadającą jego celem wszystkich terminach. Ponadto Bank1 ma pełną listę wszystkich dat. Zastanawiam się, czy istnieje prosty sposób w data.table, aby to zrobić. Próbowałem rzeczy jak pętle, ale w wyższych wymiarach staje się trudniejsze. Wszelkie sugestie będą bardzo mile widziane, dzięki!

+0

chcesz przez każdy bank czy jako całość? – Metrics

+0

Przepraszam, zapomniałem o tym wspomnieć, chciałbym go jako całość, to jest identyfikator jest tworzony przez porównanie z "globalnej" kolekcji dat. – user123276

+0

Proszę sprawdzić odpowiedź. – Metrics

Odpowiedz

2

Oto dplyr rozwiązanie:

library(dplyr) 
df %>% 
    select(Date) %>% 
    slice(unique(Date)) %>% 
    mutate(ID = row_number(as.Date(Date, format = "%d/%m/%Y"))) %>% 
    left_join(df, .) %>% 
    arrange(Name) 

Co daje:

#Joining by: "Date" 
# Name  Date ID 
#1 Bank1 1/1/2005 1 
#2 Bank1 6/1/2005 2 
#3 Bank1 1/1/2006 3 
#4 Bank1 6/1/2006 4 
#5 Bank1 1/1/2007 5 
#6 Bank2 6/1/2006 4 
#7 Bank2 1/1/2007 5 
#8 Bank3 6/1/2005 2 
#9 Bank3 1/1/2006 3 
#10 Bank3 6/1/2006 4 
#11 Bank3 1/1/2007 5 
6

myślę szukasz specjalnego symbolu .GRP:

dt[, id := .GRP, by=Date] 
#  Name  Date id 
# 1: Bank1 1/1/2005 1 
# 2: Bank1 6/1/2005 2 
# 3: Bank1 1/1/2006 3 
# 4: Bank1 6/1/2006 4 
# 5: Bank1 1/1/2007 5 
# 6: Bank2 6/1/2006 4 
# 7: Bank2 1/1/2007 5 
# 8: Bank3 6/1/2005 2 
# 9: Bank3 1/1/2006 3 
# 10: Bank3 6/1/2006 4 
# 11: Bank3 1/1/2007 5 
Powiązane problemy