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

使用dplyr::rename_at配合stringr::str_replace重命名列时报错如何解决?

报错原因

dplyr::rename_at() 要求第三个参数传入一个接收列名字符串向量为输入的函数对象,你直接写stringr::str_replace(., pattern = 'pre', replacement ='PRE')时,代码会先执行str_replace调用:这里的.会被解析为管道传入的整个tibble对象,而非列名字符串,返回的结果既不是函数也不符合rename_at的参数要求,因此触发报错。

而toupper可以直接运行的原因是你传入的是函数本身,rename_at会自动将匹配到的列名向量传入toupper执行重命名。

解决方法

只需要将str_replace调用用匿名函数包裹,传递给rename_at即可,有两种常用写法:

写法1:基础匿名函数

test <- tibble::tribble(~pre_a, ~pre_b, ~c,
                       1,2,3,
                       4,5,6)
test %>%
  dplyr::rename_at(dplyr::vars(starts_with('pre')),
                   function(col_name) stringr::str_replace(col_name, pattern = 'pre', replacement = 'PRE'))

写法2:purrr风格公式简写

test %>%
  dplyr::rename_at(dplyr::vars(starts_with('pre')),
                   ~stringr::str_replace(.x, pattern = 'pre', replacement = 'PRE'))
适配新版dplyr的推荐写法

目前dplyr已经将rename_at系列函数列为软弃用状态,更推荐用rename_with实现相同需求,参数逻辑更清晰:

test %>%
  dplyr::rename_with(
    .fn = ~stringr::str_replace(.x, pattern = 'pre', replacement = 'PRE'),
    .cols = dplyr::vars(starts_with('pre'))
  )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:18:02