Как передать специфичные для столбца аргументы lapply в data.table .SD? - PullRequest
0 голосов
/ 26 августа 2018

Я видел примеры использования .SD с lapply в data.table с простой функцией, как показано ниже:

DT[ , .(b,d,e) := lapply(.SD, tan), .SDcols = .(b,d,e)]

Но я не уверен, как использовать специфичные для столбца аргументы вфункция с несколькими аргументами.Например, у меня есть функция winsorize, я хочу применить ее к подмножеству столбцов в таблице данных, но используя процентили столбцов, например,

library(DescTools)
wlevel <- list(b=list(lower=0.01,upper=0.99), c=list(upper=0.02,upper=0.95))
DT[ , .(b,c) :=lapply(.SD, function(x) 
{winsorize(x,wlevel$zzz$lower,wlevel$zzz$upper)}), .SDcols = .(b,c)]

, где zzz будет соответствующим столбцомповторять.Я также видел потоки об использовании изменяющихся аргументов с lapply, но не в контексте таблицы данных с .SDcols

Это возможно сделать?

Это игрушечный пример, выглядящийобобщить на случай произвольного большого количества столбцов;Цикл всегда есть вариант, но я пытаюсь понять, есть ли более элегантное / эффективное решение ...

1 Ответ

0 голосов
/ 26 августа 2018

Как использовать специфичные для столбца аргументы в функции с несколькими аргументами?

Использовать mapply(FUN, dat, params1, params2, ...)где каждый из params1, params2, ... может быть списком или вектором;mapply выполняет итерации по каждому из dat, params1, params2, ... параллельно.

Обратите внимание, что в отличие от остальной части семейства apply/lapply/sapply, с mapply сначала идет аргумент функции, затем данные и параметр (ы).

В вашем случае (псевдокод, вам нужно настроить его для запуска) что-то вроде:

Вместо вложенного списка wlevel <- list(b=list(lower=0.01,upper=0.99), c=list(upper=0.02,upper=0.95)), вероятно, проще распаковать в:

w_lower <- list(b=0.01, c=0.02)
w_upper <- list(b=0.99, c=0.95) 

DT[ , c('b','c') := mapply(function(x, w_lower_col, w_upper_col) { winsorize(x, w_lower_col, w_upper_col) },
  .SD, w_lower, w_upper), .SDcols = c('b', 'c')]

Нам не нужно использовать имена столбцов (ваш zzz) при индексации в списке, mapply() следует просто перебирать список как есть.

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