我想使用datatable的frank函数按id排列日期列.但是,我的排名似乎只考虑了日期列而不是与之对应的id.我还收到其中6个我不确定的警告:
1 ..... 6:In [.data.table
(dups ,, :=
(rank,frank(dups,date,ties.method ="average")),:RHS 1长度为10(大于第6组的大小(1))最后9个元素将被丢弃.
dups <- data.table (id = c('11', '11', '11', '22','22',
'88', '99','44','44', '55'),
date = mdy(c("1-01-2016", "1-02-2016", "1-02-2016","2-01-2016",
"2-02-2016")))
so.sample <- dups[, rank := frank(dups, date, ties.method = "average"), by = id]
Run Code Online (Sandbox Code Playgroud)
例如,id = 11和date = 2016-01-01应该排名为1而不是1.5,因为该组合只有一个id和date.
请求帮助
Dav*_*yan 10
它与'rank'和'frank'都很好用.也许您的日期变量格式不正确.这是代码:
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
Run Code Online (Sandbox Code Playgroud)
此外,如果您只想枚举您的记录,使用.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
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.