Должен ли я использовать mget (), .. или с = FALSE для выбора столбцов data.table? - PullRequest
9 голосов
/ 17 февраля 2020

Существует несколько способов для выбора столбцов data.table с помощью переменной, содержащей имена нужных столбцов (with=FALSE, .., mget, ...).

Есть ли консенсус, который использовать (когда)? Является ли еще один data.table -й, чем другие?

Я мог бы привести следующие аргументы:

  1. with=FALSE и .. почти одинаково быстро, в то время как mget медленнее
  2. .. не может выбирать составные имена столбцов «на лету» ( РЕДАКТИРОВАТЬ : текущая версия CRAN 1.12.8 определенно может, я использовал старую версию, которая не смогла, поэтому этот аргумент ошибочен)
  3. mget() близок к полезному синтаксису get(), который кажется единственным способом использовать имя переменной в расчете в j

To (1):

library(data.table)
library(microbenchmark)

a <- mtcars
setDT(a)

selected_cols <- names(a)[1:4]

microbenchmark(a[, mget(selected_cols)],
               a[, selected_cols, with = FALSE],
               a[, ..selected_cols],
               a[, .SD, .SDcols = selected_cols])

#Unit: microseconds
#                             expr     min       lq     mean   median       uq      max neval cld
#          a[, mget(selected_cols)] 468.483 495.6455 564.2953 504.0035 515.4980 4341.768   100   c
#  a[, selected_cols, with = FALSE] 106.254 118.9385 141.0916 124.6670 130.1820  966.151   100 a  
#              a[, ..selected_cols] 112.532 123.1285 221.6683 129.9050 136.6115 2137.900   100 a  
# a[, .SD, .SDcols = selected_cols] 277.536 287.6915 402.2265 293.1465 301.3990 5231.872   100  b 

To (2):

b <- data.table(x = rnorm(1e6), 
                y = rnorm(1e6, mean = 2, sd = 4), 
                z = sample(LETTERS, 1e6, replace = TRUE))

selected_col <- "y"

microbenchmark(b[, mget(c("x", selected_col))],
               b[, c("x", selected_col), with = FALSE],
               b[, c("x", ..selected_col)])
# Unit: milliseconds
#                                    expr      min       lq      mean   median       uq      max neval cld
#         b[, mget(c("x", selected_col))] 5.454126 7.160000 21.752385 7.771202 9.301334 147.2055   100   b
# b[, c("x", selected_col), with = FALSE] 2.520474 2.652773  7.764255 2.944302 4.430173 100.3247   100  a 
#             b[, c("x", ..selected_col)] 2.544475 2.724270 14.973681 4.038983 4.634615 218.6010   100  ab

К (3):

b[, sqrt(get(selected_col))][1:5]
# [1] NaN 1.3553462 0.7544402 1.5791845 1.1007728

b[, sqrt(..selected_col)]
# error

b[, sqrt(selected_col), with = FALSE]
# error

РЕДАКТИРОВАТЬ : добавлено .SDcols к эталону в (1), b[, c("x", ..selected_col)] к (2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...