为什么在 dplyr 中使用 mutate + across 时“scale”会创建末尾带有“[,1]”的列?

Rua*_*tel 6 r scale dplyr across

请参阅下面的代码。

\n

mutate(across(everything(), scale, .names = "{.col}_z"))语法的一部分是生成末尾[,1]附加的列。

\n

两个问题:

\n
    \n
  1. 为什么会发生这种情况?
  2. \n
  3. 我怎样才能避免或消除它?
  4. \n
\n
library(dplyr)\n\n# Input\ndf_test <- tibble(x = c(1, 2, 3, 4), y = c(5, 6, 7, 8))\n\n# My code generating x_z and y_z\ndf_scaled <- df_test %>% \n  mutate(across(everything(), scale, .names = "{.col}_z"))\n\n# Output\ndf_scaled\n#> # A tibble: 4 \xc3\x97 4\n#>       x     y x_z[,1] y_z[,1]\n#>   <dbl> <dbl>   <dbl>   <dbl>\n#> 1     1     5  -1.16   -1.16 \n#> 2     2     6  -0.387  -0.387\n#> 3     3     7   0.387   0.387\n#> 4     4     8   1.16    1.16\n
Run Code Online (Sandbox Code Playgroud)\n

预期产出

\n
#> # A tibble: 4 \xc3\x97 4\n#>       x     y     x_z     y_z\n#>   <dbl> <dbl>   <dbl>   <dbl>\n#> 1     1     5  -1.16   -1.16 \n#> 2     2     6  -0.387  -0.387\n#> 3     3     7   0.387   0.387\n#> 4     4     8   1.16    1.16\n
Run Code Online (Sandbox Code Playgroud)\n

创建于 2022 年 12 月 30 日,使用reprex v2.0.2

\n

akr*_*run 5

scale返回一个matrix. 我们可以使用c或提取列[或使用as.numeric删除dim属性

\n
library(dplyr)\ndf_test %>% \n  mutate(across(everything(),\n     ~ as.numeric(scale(.x)), .names = "{.col}_z"))\n
Run Code Online (Sandbox Code Playgroud)\n

-输出

\n
# A tibble: 4 \xc3\x97 4\n      x     y    x_z    y_z\n  <dbl> <dbl>  <dbl>  <dbl>\n1     1     5 -1.16  -1.16 \n2     2     6 -0.387 -0.387\n3     3     7  0.387  0.387\n4     4     8  1.16   1.16 \n
Run Code Online (Sandbox Code Playgroud)\n
\n

即检查单列上的输出

\n
> scale(df_test[[1]])\n           [,1]\n[1,] -1.1618950\n[2,] -0.3872983\n[3,]  0.3872983\n[4,]  1.1618950\nattr(,"scaled:center")\n[1] 2.5\nattr(,"scaled:scale")\n[1] 1.290994\n
Run Code Online (Sandbox Code Playgroud)\n

如果我们检查源代码

\n
> scale.default\nfunction (x, center = TRUE, scale = TRUE) \n{\n    x <- as.matrix(x) # it is converting to matrix\n...\n
Run Code Online (Sandbox Code Playgroud)\n

并且在应用中是必需的apply/colMeans/sweep,因此当我们将向量传递给 时scale,它确实将其转换为单列矩阵

\n
> as.matrix(df_test$x)\n     [,1]\n[1,]    1\n[2,]    2\n[3,]    3\n[4,]    4\n
Run Code Online (Sandbox Code Playgroud)\n