【问题标题】:R data table rolling unique [closed]R数据表滚动唯一[关闭]
【发布时间】:2019-04-21 08:54:43
【问题描述】:

一直在寻找以滚动方式计算数据数据表中列的唯一值的解决方案,找到了rollmean但没有找到类似rollunique的东西。

使用数据表实现这一目标的最佳做法是什么?

谢谢

【问题讨论】:

    标签: r data.table rolling-computation


    【解决方案1】:

    1) 一个选项是使用zoo::rollapply

    样本数据:

    library(data.table)
    set.seed(0L)
    sz <- 1e5L
    winsz <- 5L
    DT <- data.table(ID=sample(letters, sz, replace=TRUE))
    

    使用zoo:rollapply*的示例用法:

    DT[, numUniq := zoo::rollapplyr(ID, winsz, uniqueN, fill=NA_integer_)]
    

    2) 另一种选择是编写自己的窗口:

    DT[, numUniq2 := replace(
        sapply(1:.N, function(n) uniqueN(ID[max(n-winsz+1, 1L):n])),
        .I < winsz,
        NA_integer_)]
    

    3) 另一种选择是使用data.table::shift

    DT[, numUniq3 := replace(
        apply(setDT(shift(ID, 0L:(winsz-1L))), 1L, uniqueN),
        1L:.N < winsz,
        NA_integer_)]
    

    输出:

            ID numUniq numUniq2 numUniq3
         1:  x      NA       NA       NA
         2:  g      NA       NA       NA
         3:  j      NA       NA       NA
         4:  o      NA       NA       NA
         5:  x       4        4        4
        ---                             
     99996:  k       4        4        4
     99997:  a       4        4        4
     99998:  f       4        4        4
     99999:  z       4        4        4
    100000:  c       5        5        5
    

    基准测试

    计时码:

    microbenchmark::microbenchmark(
        zooRoll=DT[, numUniq := zoo::rollapplyr(ID, winsz, uniqueN, fill=NA)],
        sapply=DT[, numUniq2 := replace(
            vapply(1L:.N, function(n) uniqueN(ID[max(n-winsz+1L, 1L):n]), integer(1L)),
            1L:.N < winsz,
            NA_integer_)],
        shift=DT[, numUniq3 := replace(
            apply(setDT(shift(ID, 0L:(winsz-1L))), 1L, uniqueN),
            1L:.N < winsz,
            NA_integer_)],
        times=3L)
    

    时间安排:

    Unit: seconds
        expr      min       lq     mean   median       uq      max neval
     zooRoll 1.723915 1.774423 1.837433 1.824931 1.894191 1.963451     3
      sapply 1.214608 1.224971 1.230763 1.235333 1.238840 1.242348     3
       shift 1.188266 1.234769 1.266852 1.281272 1.306145 1.331018     3
    

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 2016-07-31
      • 2019-12-29
      • 1970-01-01
      相关资源
      最近更新 更多