在按另一个变量分组的 r 数据表中排名值
Posted
技术标签:
【中文标题】在按另一个变量分组的 r 数据表中排名值【英文标题】:Rank values in r datatable grouped by another variable 【发布时间】:2016-09-15 06:47:40 【问题描述】:我想使用数据表的 frank 函数按 id 对日期列进行排名。但是,我的排名似乎只考虑了日期列,而不是对应于它的 id。我还收到了其中 6 个我不确定的警告:
1.....
6: 在[.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]
例如,id = 11 和 date = 2016-01-01 应该排名 1 而不是 1.5,因为只有一个 id 和 date 的组合。
感谢帮助
【问题讨论】:
【参考方案1】:它适用于“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
此外,如果您只想枚举您的记录,使用.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
我希望这会有所帮助。
【讨论】:
以上是关于在按另一个变量分组的 r 数据表中排名值的主要内容,如果未能解决你的问题,请参考以下文章