我有一个带有数字数据的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()
的{{3}},但是速度非常慢。 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)"
答案 0 :(得分:2)
使用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)(.))