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

如何对数据框指定列单元格首字母大写?解决gsub+across报错问题

R语言指定列应用gsub首字母大写出错修复

原始数据与需求

首先是你定义的数据框:

col1 <- c("hello my name is", "Nice to meet you", "how are you")
col2 <- c("dog", "Cats", "Frogs are cool")
col3 <- c("Pause", "breathe in and out", "what are you talking about")
df <- data.frame(col1, col2, col3)

需要处理的列:

vars <- c("col1", "col2")

错误代码与报错信息

你尝试的代码:

df <- df %>%
  as_tibble() %>%
  mutate(across(vars), gsub, pattern = "^(\\w)(\\w+)", replacement = "\\U\\1\\L\\2", perl = TRUE)

出现的错误:

Error in `mutate_cols()`:
! Problem with `mutate()` input `..2`.
ℹ `..2 = gsub`.
x `..2` must be a vector, not a function.
Run `rlang::last_error()` to see where the error occurred.

错误原因与解决方法

错误原因

across的语法使用错误,正确调用格式是across(.cols, .fns, ...),你把gsub函数放在了across括号外,导致mutate将其识别为单独的输入列,而非要应用到目标列的函数。另外,用字符向量指定列时,建议用all_of(vars)明确引用,避免选择歧义。

正确代码写法

写法一:公式形式(推荐,逻辑更清晰)

library(dplyr)

df <- df %>%
  as_tibble() %>%
  mutate(across(all_of(vars), ~gsub(pattern = "^(\\w)(\\w+)", replacement = "\\U\\1\\L\\2", x = ., perl = TRUE)))

写法二:直接传递函数与参数

df <- df %>%
  as_tibble() %>%
  mutate(across(all_of(vars), gsub, pattern = "^(\\w)(\\w+)", replacement = "\\U\\1\\L\\2", perl = TRUE))

额外优化:每个单词首字母大写

如果需求是将单元格内每个单词的首字母都大写(而非仅第一个单词),可以调整正则表达式为\\b(\\w)(\\w*),代码如下:

df <- df %>%
  as_tibble() %>%
  mutate(across(all_of(vars), ~gsub(pattern = "\\b(\\w)(\\w*)", replacement = "\\U\\1\\L\\2", x = ., perl = TRUE)))

处理后示例:"hello my name is"会变为"Hello My Name Is"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:55:31