У меня есть именованный список переменной длины, содержащие функцииБыстрый способ (векторизации?), Чтобы применить список функций для соответствующих столбцов в кадре данных
mFunc <- list(A = identity, B = exp)
У меня также есть data.frame
, имена которых являются надстройкой имена mFunc
:
dat <- data.frame(A = 1:3, B = 1:3, C = 1:3)
То, что я хочу сделать, это использовать все функции в mFunc
для соответствующих столбцов в dat
. Если бы я сделать это вручную, я бы
dat$A <- mFunc$A(dat$A)
dat$B <- mFunc$B(dat$B)
и ожидаемые результаты могли бы быть:
# A B C
# 1 1 2.718282 1
# 2 2 7.389056 2
# 3 3 20.085537 3
Я думал об использовании петли на имена mFunc
library(plyr)
dat[, names(mFunc)] <- llply(names(mFunc), function(n) mFunc[[n]](dat[[n]]))
, который дает мне желаемый результат. Мне было интересно, есть ли более быстрые (векторизованные) способы сделать это без использования неявного цикла?
Как сделать одну функцию, которая переключается на разные функции на основе имени прошедшего столбца? – zx8754
Заполнение столбцов должно быть достаточно эффективным. Я не думаю, что вы можете векторизовать его любым лучшим способом, поскольку у вас есть разные функции, которые необходимо оценить. Хотя я не понимаю, почему вы используете 'plyr'. Почему не просто 'dat [, names (mFunc)] <- lapply (names (mFunc), function (x) mFunc [[x]] (dat [[x]]))'? Другим способом может быть использование «mapply», например 'dat [, names (mFunc)] <- mapply (function (x, y) x (y), mFunc, dat [, names (mFunc)])' –
Я использую 'plyr', потому что мне нравится концепция, что вы можете контролировать ввод и вывод вашей функции' apply'. База 'R' имеет аналогичные функции, но я обнаружил, что функции' plyr' более читабельны и легче переключаются между собой. Без контекста я согласен с вами в том, что 'lapply' делает то же самое, но в остальной части моего кода я использую всевозможные' 'ply', и мне нравится использовать глаголы из одного семейства. – thothal