我想使用datatable的frank函数按id排列日期列。但是,我的排名似乎只考虑了日期列而不是与之对应的id。我还收到了其中6个我不确定的警告:
1 .....
6:在"script" : "doc['CustomerInfo.CustomerCompany'].size() > 2"
(dups ,, [.data.table
(排名,frank(dups,date,ties.method =" average")),:
RHS 1的长度为10(大于第6组的大小(1))。最后9个元素将被丢弃。
:=
例如,id = 11和date = 2016-01-01应该排名为1而不是1.5,因为该组合只有一个id和日期。
请求帮助
答案 0 :(得分:9)
它与两者都很好,排名'和坦率的'。也许您的日期变量格式不正确。这是代码:
dt1 <- data.table (id = c('11', '11', '11', '22','22',
'88', '99','44','44', '55'),
date = as.Date(c("01-01-2016",
"01-02-2016",
"01-02-2016",
"02-01-2016",
"02-02-2016"),
format = "%m-%d-%Y"))
setkey(dt1, date)
setkey(dt1, id)
dt1
id date
1: 11 2016-01-01
2: 11 2016-01-02
3: 11 2016-01-02
4: 22 2016-02-01
5: 22 2016-02-02
6: 44 2016-01-02
7: 44 2016-02-01
8: 55 2016-02-02
9: 88 2016-01-01
10: 99 2016-01-02
dt1[, rank := frank(date),
by = list(id)]
dt1
id date rank
1: 11 2016-01-01 1.0
2: 11 2016-01-02 2.5
3: 11 2016-01-02 2.5
4: 22 2016-02-01 1.0
5: 22 2016-02-02 2.0
6: 44 2016-01-02 1.0
7: 44 2016-02-01 2.0
8: 55 2016-02-02 1.0
9: 88 2016-01-01 1.0
10: 99 2016-01-02 1.0
此外,如果您只想枚举您的记录,使用.N
可能会非常有用:
dt1[, Visit := 1:.N,
by = list(id)]
dt1
id date rank Visit
1: 11 2016-01-01 1.0 1
2: 11 2016-01-02 2.5 2
3: 11 2016-01-02 2.5 3
4: 22 2016-02-01 1.0 1
5: 22 2016-02-02 2.0 2
6: 44 2016-01-02 1.0 1
7: 44 2016-02-01 2.0 2
8: 55 2016-02-02 1.0 1
9: 88 2016-01-01 1.0 1
10: 99 2016-01-02 1.0 1
我希望这会有所帮助。