2015-03-07 8 views
5

Angenommen, ich habe Daten, die wie folgt aussieht:Gibt es eine Möglichkeit in der data.table IDs nach Gruppe basierend auf einem Bezeichner zuzuordnen?

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 
.... 

Hier ist das erste Datum 1.1.2005 ist und die letzte ist 1.1.2007. Ich möchte eine ID zuweisen, so dass ich habe:

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 
.... 

ich im Grunde eine ID für das Datum die Termine ihrer Reihenfolge aller entsprechenden zuweisen möchten. Außerdem hat Bank1 die vollständige Liste aller Daten. Ich habe mich gefragt, ob es dafür in data.table einen einfachen Weg gibt. Ich habe Dinge wie Loops ausprobiert, aber bei höheren Dimensionen wird es schwieriger. Irgendwelche Vorschläge würden sehr geschätzt werden, danke! Hier

+0

wollen Sie von jedem Bank oder als Ganzes? – Metrics

+0

Entschuldigung vergessen zu erwähnen, dass ich es als Ganzes möchte, dass die ID durch Vergleich mit der "globalen" Sammlung von Daten erstellt wird. – user123276

+0

Bitte überprüfen Sie die Antwort. – Metrics

Antwort

2

ist eine dplyr Lösung:

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

Welche gibt:

#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

Ich glaube, Sie suchen das besondere Symbol .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 
Verwandte Themen