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

dplyr中使用mutate+across调用scale为何生成带[,1]的列?

dplyr中scale生成列名带[,1]的问题解决

问题

使用mutate(across(everything(), scale, .names = "{.col}_z"))语法生成的列名末尾会附加[,1],比如期望的x_z变成了x_z[,1]。需要明确两个问题:

  1. 该现象产生的原因是什么?
  2. 如何避免或去除[,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:00:53