如何在map_df()中指定列并应用prettyNum函数?
修正方法详解
你的问题出在mutate_at的使用方式上——直接在.funs里调用prettyNum时,.的指代对象搞错了,而且.funs需要接收函数(或函数表达式),不是直接执行函数的结果。下面给你两种可行的修正方案:
方案1:使用mutate_at(兼容旧版tidyverse)
把map_df去掉,直接在mutate_at里用lambda表达式指定函数逻辑,这里的.会正确指代每一列的数值:
test <- mtcars %>% mutate_at(vars(drat, wt), ~prettyNum(., big.mark = ".", decimal.mark = ","))
方案2:使用across(tidyverse 1.0.0+推荐写法)
现在tidyverse更推荐用across来替代mutate_at这类作用域动词,写法更清晰灵活,有两种方式:
方式A:lambda表达式
test <- mtcars %>% mutate(across(c(drat, wt), ~prettyNum(., big.mark = ".", decimal.mark = ",")))
方式B:直接传递函数和参数
因为prettyNum的第一个参数就是要处理的数值,我们可以直接把函数和后续参数传给across,不用写lambda:
test <- mtcars %>% mutate(across(c(drat, wt), prettyNum, big.mark = ".", decimal.mark = ","))
这两种方案都会只对drat和wt列应用prettyNum格式处理,其他列保持原样,最终返回完整的数据框。
内容的提问来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

