2015-03-07 14 views
5

Supponiamo che io sono dati che assomiglia a:C'è un modo in data.table per assegnare ID per gruppo in base a un identificatore?

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

Ecco la prima data è 1/1/2005 e l'ultima è 1/1/2007. Vorrei assegnare un ID in modo tale che ho:

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

Io fondamentalmente desidera assegnare un ID per la data corrispondente al suo ordine di tutte le date. Inoltre, Bank1 ha l'elenco completo di tutte le date. Mi stavo chiedendo se c'era un modo semplice in data.table per farlo. Ho provato cose come loops ma a dimensioni superiori diventa più difficile. Qualsiasi suggerimento sarebbe molto apprezzato, grazie!

+0

vuoi da ciascun banca o nel suo insieme? – Metrics

+0

scusa, ho dimenticato di dirlo, mi piacerebbe nel suo insieme, cioè l'ID viene creato confrontandolo con la raccolta "globale" di date. – user123276

+0

Si prega di verificare la risposta. – Metrics

risposta

2

Ecco una soluzione dplyr:

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

che dà:

#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

Penso che tu stai cercando il simbolo speciale .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 
Problemi correlati