【问题标题】:unique.data.table select last row in place of the firstunique.data.table 选择最后一行代替第一行
【发布时间】:2013-07-10 21:28:35
【问题描述】:

在键入的data.table 上调用unique,您将在每个组中拥有唯一的行。如果有重复的行,将采用第一行。当我需要最后一个而不是(通常是最后一个临时事务)时,我使用.SD[.N]

library(data.table)
library(microbenchmark)

dt <- data.table(id=sample(letters, 10000, T), var=rnorm(10000), key="id")

microbenchmark(unique(dt), dt[, .SD[.N], by=id])
Unit: microseconds
                   expr      min        lq    median       uq        max neval
             unique(dt)  570.882  586.1155  595.8975  608.406   3209.122   100
 dt[, .SD[.N], by = id] 6532.739 6637.7745 6694.3820 6776.968 208264.433   100

你知道更快的方法吗?

【问题讨论】:

  • 我很惊讶 unique.data.tableduplicated.data.table 不支持 fromLast 参数,如 unique.data.frameduplicated.data.frame

标签: r data.table


【解决方案1】:

创建一个包含关键变量的唯一组合的data.table,然后使用mult = 'last' 加入

使用.SD 很方便,但速度较慢。如果您愿意,可以改用.I

dtu <- unique(dt)[,key(dt), with = FALSE]
dt[dtu, mult = 'last']

或者

 dt[ dt[,  .I[.N], by = key(dt)]$V1]

【讨论】:

  • @Farrel In ?data.table(在by下)(.I is an integer vector length .N holding the row locations in x for this group
  • 我认为这真是太聪明了。这是正在发生的事情吗?代码在 dt 中创建包含组的第 N 个实例的行号并对其进行向量化,其中组是由键定义的唯一条目的集合。
【解决方案2】:

data.table v1.9.4 开始,您可以使用fromLast = TRUE

microbenchmark(unique(dt, by = "id"), 
               dt[, .SD[.N], by=id], 
               unique(dt, by = "id", fromLast = TRUE))

Unit: microseconds
                                   expr     min       lq     mean   median       uq      max neval cld
                  unique(dt, by = "id") 333.978 355.1900 406.1585 371.1360 393.4015 3203.769   100  a 
                 dt[, .SD[.N], by = id] 519.320 541.4345 580.2176 553.6200 563.5490 2690.167   100   b
 unique(dt, by = "id", fromLast = TRUE) 338.190 366.4725 430.1296 380.9145 400.7730 4774.663   100  a 

【讨论】:

    【解决方案3】:

    这是另一种选择,尽管它看起来比@mnel 的答案稍慢,至少对于示例而言。

    dt[,list(var,RN=.N:1),by=id][RN==1L]
    

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 2015-10-10
      • 2023-03-12
      相关资源
      最近更新 更多