如何在dplyr的across中通过列名子串生成指定格式新列名?
解决方法
你遇到的问题是.names参数中的gsub没有正确处理列名占位符{.col}——你直接对字符串"{.col}"应用了替换操作,而非实际的列名。以下是两种优雅的适配任意列数的解决方案:
方法1:简洁Lambda表达式写法
library(dplyr) df <- tibble( x = c(5, 5), Column_1 = c(0.5, 0.5), Column_2 = c(0.75, 0.75) ) df <- mutate(df, across(starts_with("Column_"), ~ .x * x, .names = ~ gsub("Column_", "ABC_", .x) ) )
方法2:可读性更强的命名函数写法
df <- mutate(df, across(starts_with("Column_"), function(col_value) col_value * x, .names = function(col_name) gsub("Column_", "ABC_", col_name) ) )
最终输出结果
执行代码后会得到你期望的数据框:
| x | Column_1 | Column_2 | ABC_1 | ABC_2 |
|---|---|---|---|---|
| 5 | 0.5 | 0.75 | 2.5 | 3.75 |
| 5 | 0.5 | 0.75 | 2.5 | 3.75 |
关键说明
- 原代码错误核心:
paste0("ABC", gsub("Column_", "", "{.col}"))仅对字面字符串"{.col}"做了替换拼接,未关联到实际的列名(如Column_1)。 - 上述方案通过在
.names中传入函数,直接对每个匹配的列名进行前缀替换,自动适配任意数量的Column_*列,完全无需硬编码数字。
内容的提问来源于stack exchange,提问作者snowman
相关产品推荐
相关产品推荐

