R: вызвать функцию с именами столбцов data.frame в качестве аргументов - PullRequest
1 голос
/ 13 октября 2019

У меня есть data.frame с числовыми данными и функцией, которая принимает имена столбцов в качестве аргументов. Как вызвать функцию с этими столбцами в качестве аргументов? Что-то вроде распаковки python.

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

Вот простая версия проблемы.

func = function(a, b, c) a * b^2 + c
df = data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10))
df %>%
    mutate(result = func(.))  # what to do here that doesn't involve "a", "b", "c"?

Я пробовал это решение , включающее rowwise(), но оно очень медленное. func может выполнять векторизованные вычисления.

Мое текущее решение довольно уродливо:

call_str = paste0("func(", paste0(colnames(df), " = df$", colnames(df), collapse=","), ")")
result = eval(parse(text = call_str))

В этом примере call_str равно

"func(a = df$a, b = df$b, c = df$c)"

1 Ответ

2 голосов
/ 13 октября 2019

Используйте do.call:

df %>% mutate(result = do.call("func", .))

или invoke, которая является аналогичной функцией в муррре:

library(purrr)
df %>% mutate(result = invoke("func", .))

или lift, которая воздействует на саму функцию, создаваяновая функция:

library(purrr)
df %>% mutate(result = lift(func)(.))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...