семантика ссылки на data.table: использование памяти для перебора всех столбцов - PullRequest
0 голосов
/ 05 сентября 2018

При переборе всех столбцов в таблице данных R с использованием ссылочной семантики, что имеет больше смысла с точки зрения использования памяти:

(1) dt[, (all_cols) := lapply(.SD, my_fun)]

или

(2) lapply(colnames(dt), function(col) dt[, (col) := my_fun(dt[[col]])])[[1]]

У меня такой вопрос: в (2) я заставляю data.table перезаписывать dt для столбцов за столбцами, поэтому я предполагаю, что потребуется дополнительная память в порядке размера столбца. Это также относится к (1)? Или все lapply(.SD, my_fun) оцениваются до того, как исходные столбцы будут перезаписаны?

Пример кода для запуска вышеуказанных вариантов:

library(data.table)
dt <- data.table(a = 1:10, b = 11:20)
my_fun <- function(x) x + 1
all_cols <- colnames(dt)

1 Ответ

0 голосов
/ 06 сентября 2018

Следуя предложению @Frank, наиболее эффективным способом (с точки зрения памяти) заменить столбец data.table на столбец с применением функции my_fun к каждому столбцу является

library(data.table)
dt <- data.table(a = 1:10, b = 11:20)
my_fun <- function(x) x + 1
all_cols <- colnames(dt)

for (col in all_cols) set(dt, j = col, value = my_fun(dt[[col]]))

Это в настоящее время (v1.11.4) не обрабатывается так же, как выражение типа dt[, lapply(.SD, my_fun)], которое внутренне оптимизировано до dt[, list(fun(a), fun(b), ...)], где a, b, ... - это столбцы в .SD (см. ?datatable.optimize). Это может измениться в будущем и отслеживается # 1414 .

...