You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dplyr::across中fct_recode参数传递错误排查及两种语法解析

关于dplyr::across中直接传递fct_recode函数报错的原因解析

我在R语言中使用dplyr::across将部分[0,1]数值变量转换为带有["no","yes"]水平的因子。转换变量类型时,两种写法都能成功,但修改因子水平时,直接传递fct_recode函数的df3_a写法报错,而使用公式语法的df3_b写法正常,想知道df3_a的错误原因是什么?

代码示例

library(dplyr)
library(forcats)

# 测试数据集
df = data.frame(
  var_a = c(0,1,0,1,0,1,0,1,0,1),
  var_b = c(0,1,0,1,0,1,0,1,0,1),
  number_a = 1:10,
  number_b = 21:30)

# 选择目标列
some_cols = c("var_a", "var_b" )


# ---- 1) 类型转换
# 写法1可行
df2_a <- df %>% 
  mutate(across(.cols = some_cols, .fns = as.factor, .names = "{.col}_f")) 
# 写法2也可行
df2_b <- df %>% 
  mutate(across(some_cols, ~ as.factor(.x), .names = "{.col}_f")) 


# ---- 2) 修改因子水平
# 这个写法报错!!!
df3_a <- df2_a %>% 
  mutate(across(.cols = ends_with("_f"), 
                .fns = fct_recode, c(yes = "1", no = "0" )))
# 这个写法正常运行
df3_b <- df2_b %>% 
  mutate(across(ends_with("_f"), ~ fct_recode(.x , yes = "1", no = "0" )))

错误原因解析

核心问题出在**fct_recode的参数要求**和across传递参数的方式上:

  • 当你在across中直接传递函数名(比如.fns = fct_recode)时,across会自动把当前处理的列作为第一个参数传给该函数,后续你写的参数会依次作为函数的第二、第三...参数。
  • fct_recode的参数规则是:第一个参数是要修改的因子对象,后面必须跟多个单独的命名参数(比如yes = "1"),用来指定新水平和旧水平的映射,它不接受把这些映射打包成一个向量(比如c(yes = "1", no = "0"))作为参数。

你写的df3_a里,c(yes = "1", no = "0")被当成了fct_recode的第二个参数,但fct_recode根本不认这种向量格式,所以直接报错。

而公式语法~ fct_recode(.x , yes = "1", no = "0")是显式把当前列(.x)作为第一个参数,然后把yes = "1"、no = "0"作为单独的命名参数传递,完全符合fct_recode的参数要求,所以能正常运行。

修正后的直接传函数写法

如果想不用公式语法,直接传fct_recode,只要把命名参数单独列出来就行:

df3_a_fixed <- df2_a %>% 
  mutate(across(ends_with("_f"), 
                fct_recode, yes = "1", no = "0"))

内容的提问来源于stack exchange,提问作者Lulliter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:30:36