r数据表中的等级值按另一个变量分组

use*_*851 3 r rank data.table

我想使用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)

我希望这有帮助.