dplyr使用across搭配matches()报错:mutate输入须为向量而非函数
问题解答
matches()与across()的搭配可用性
matches() 完全可以和 across() 搭配使用,这是dplyr中批量处理多列的标准用法之一。matches()属于tidyselect语法体系的列选择器,作用是匹配符合正则规则的列名,刚好适配across()的列选择参数需求,你的报错和二者的搭配无关。
报错原因
你写的~percent是purrr风格的匿名函数简写,这种写法要求必须指定传入的参数(用.代表当前操作的列),你仅写了函数名percent,相当于把函数本身直接返回,而没有对列数据做计算,因此触发了“返回值是函数不是向量”的报错。
修正方案
有两种常用的正确写法:
- 写法1:直接传递函数名,不需要加匿名函数标识
~
mydf %>% mutate(across(matches('_pct'), percent))
- 写法2:补全匿名函数的参数调用
mydf %>% mutate(across(matches('_pct'), ~percent(.)))
运行后输出结果如下:
x a_pct y b_pct 1 1 30% a 50% 2 2 20% b 60% 3 3 10% c 70%
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

