【问题标题】:Rank values in r datatable grouped by another variable在按另一个变量分组的 r 数据表中排名值
【发布时间】: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 的组合。

感谢帮助

【问题讨论】:

    标签: r data.table rank


    【解决方案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
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多