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

时间:2016-05-18 16:35:10

标签: r data.table rank

我想使用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和日期。

请求帮助

1 个答案:

答案 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

我希望这会有所帮助。