假设我的数据如下:
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
....
这里第一个日期是2005年1月1日,最后一个日期是1/1/2007。我想分配一个ID,我有:
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
....
我基本上想要为与所有日期的顺序相对应的日期分配ID。此外,Bank1拥有所有日期的完整列表。我想知道data.table中是否有一种简单的方法可以做到这一点。我尝试过像循环这样的东西但是在更高的尺寸上变得更难。任何建议都将不胜感激,谢谢!
答案 0 :(得分:7)
我认为您正在寻找特殊符号.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
答案 1 :(得分:2)
以下是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)
给出了:
#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