如何用mutate按行调用自定义函数,无需显式指定参数?
解决方法:自动匹配列名与函数参数
当你的tibble列名和函数参数完全对应(不管顺序),可以用以下几种方法避免逐个指定参数:
方法1:使用pmap系列函数(推荐)
pmap会自动按列名匹配函数参数,逐行传递数据,无需手动指定:
library(tidyverse) myFunc <- function(a, b, c) a*b^c tbl <- tibble(b = 2:6, a = 1:5, c = -1:3) tbl |> mutate(result = pmap_dbl(., myFunc))
pmap_dbl用于接收函数返回的数值型结果,如果函数返回其他类型,可以用pmap或对应类型的pmap_*函数(比如pmap_chr)。
方法2:结合rowwise与do.call
在按行分组后,用do.call把当前行的所有列作为参数传递给函数:
tbl |> rowwise() |> mutate(result = do.call(myFunc, across(everything()))) |> ungroup()
across(everything())会提取当前行的所有列并转为列表,do.call则用这个列表作为参数调用myFunc。
为什么之前的尝试失败?
myFunc():没有传递任何参数,函数需要a/b/c三个参数,必然报错。myFunc(.data):.data代表整个tibble对象,会被当作单个参数传给myFunc的第一个参数a,类型不匹配导致错误。
内容的提问来源于stack exchange,提问作者mikemtnbikes
相关产品推荐
相关产品推荐

