【问题标题】:R: call function with data.frame column names as argumentsR:以 data.frame 列名作为参数调用函数
【发布时间】:2020-02-10 02:14:01
【问题描述】:

我有一个带有数字数据的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()this solution,但速度非常慢。 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)"

【问题讨论】:

    标签: r function arguments parameter-passing


    【解决方案1】:

    使用do.call:

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

    invoke,这是 purrr 中类似的功能:

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

    lift 作用于函数本身产生一个新函数:

    library(purrr)
    df %>% mutate(result = lift(func)(.))
    

    【讨论】: