2015-06-01 2 views
3

Я пытаюсь получить столбец из data.table с помощью данного выражения. Я получаю CaseID как выражение. expr_caseid <- expression(CaseID). Как получить столбец по выражению как можно быстрее?data.table быстрый доступ к столбцу по выражению

library(data.table) 
dt_fcst <- data.table(CaseID = as.integer(runif(1e8)*100)) 

expr_caseid <- expression(CaseID) 

testExpr = function(DT_, expr_){ 
    DT_[[deparse(substitute(expr_))]] 
} 

testGetElement = function(DT_, expr_){ 
    getElement(DT_, deparse(substitute(expr_))) 
} 

library(microbenchmark) 
microbenchmark(
## by_char = dt_fcst[['CaseID']], 
    by_deparse = testExpr(dt_fcst, CaseID), 
## by_expr = dt_fcst[, list(CaseID)], 
## by_dollar = dt_fcst$CaseID, 
    by_eval = eval(
     expr_caseid, 
     envir = as.environment(dt_fcst) 
    ), 
    by_getElement = testGetElement(dt_fcst, CaseID) 
# ,by_index = [email protected][[1]] 
, times = 1000L) 

Результаты измерений производительности:

Единица измерения: микросекунд

  expr min lq mean median uq max neval cld 
    by_deparse 37.2 41.35 55.0700 46.15 60.6 357.8 1000 b 
     by_eval 15.9 22.30 29.2194 24.80 34.3 289.8 1000 a 
by_getElement 38.3 42.20 55.9087 47.30 63.2 283.3 1000 b 
+1

Не принуждать к 'environment'; (как «список»): «microbenchmark» ( ev = eval (expr_caseid, envir = as.environment (dt_fcst)), ev2 = eval (expr_caseid, dt_fcst) ) '. Я вижу его 4 раза быстрее. Во всяком случае, мне любопытно, почему вы делали эту операцию столько раз, что скорость имела значение ...? Кроме того, это не похоже на 'data.table'. – Frank

+0

@Frank Я делаю огромное количество симуляций и записываю результаты в data.table на каждой итерации. Таблица обновляется данным выражением для столбца. Я отмечен тегом 'data.table', потому что я думал, что есть быстрый способ сделать это, хотя базовые структуры' C++ ', чтобы получить его быстрее, чем я знаю из R. Thx для принудительного консультирования, я думал, что 'данные. table' является средой, чем я ожидал бы в документации 'as.environment': * ... Если это уже среда, просто верните ее. * –

ответ

0

с комментариями по Frank

Unit: microseconds 
      expr min lq  mean median uq  max neval cld 
by_evalNoCoerce 1.8 4.00 8.7652 5.30 7.60 479.8 1000 a 


microbenchmark(
## by_char = dt_fcst[['CaseID']], 
    by_deparse = testExpr(dt_fcst, CaseID), 
## by_expr = dt_fcst[, list(CaseID)], 
## by_dollar = dt_fcst$CaseID, 
    by_eval = eval(
     expr_caseid, 
     envir = as.environment(dt_fcst) 
    ), 
    by_getElement = testGetElement(dt_fcst, CaseID), 
    by_evalNoCoerce = eval(expr_caseid, dt_fcst) 
# ,by_index = [email protected][[1]] 
, times = 1000L) 
Смежные вопросы