dplyr中使用mutate+across调用scale为何生成带[,1]的列?
dplyr中scale生成列名带[,1]的问题解决
问题
使用mutate(across(everything(), scale, .names = "{.col}_z"))语法生成的列名末尾会附加[,1],比如期望的x_z变成了x_z[,1]。需要明确两个问题:
- 该现象产生的原因是什么?
- 如何避免或去除
[,1]?
原因解析
scale()函数默认返回的是矩阵类型,而非普通向量。tibble在处理矩阵列时,会自动在列名后添加[,1],以此标识这是矩阵的第一列——哪怕矩阵只有一列,tibble也会保留其二维结构的维度信息,这就是列名出现[,1]的核心原因。
解决方法
以下是几种实用的处理方式:
方法1:生成时将结果转为向量
在across中对scale()的输出用as.vector()转换,把二维矩阵转为普通向量,tibble就会使用设定的正常列名:
library(dplyr) df_test <- tibble(x = c(1, 2, 3, 4), y = c(5, 6, 7, 8)) df_scaled <- df_test %>% mutate(across(everything(), ~as.vector(scale(.x)), .names = "{.col}_z")) # 输出结果 df_scaled #> # A tibble: 4 × 4 #> x y x_z y_z #> <dbl> <dbl> <dbl> <dbl> #> 1 1 5 -1.16 -1.16 #> 2 2 6 -0.387 -0.387 #> 3 3 7 0.387 0.387 #> 4 4 8 1.16 1.16
方法2:事后批量修改列名
如果已经生成了带[,1]的列,可以用rename_with批量替换后缀:
df_scaled <- df_scaled %>% rename_with(~gsub("\\[,1\\]", "", .x), ends_with("[,1]"))
不过这种方式不如生成时直接处理高效。
内容的提问来源于stack exchange,提问作者Ruam Pimentel
相关产品推荐
相关产品推荐

