【问题标题】:Why does `mutate(across(...))` with `scale()` adds [,1] to the column header?为什么带有 `scale()` 的 `mutate(across(...))` 会将 [,1] 添加到列标题?
【发布时间】:2022-01-19 10:36:47
【问题描述】:

这似乎太基本了,无法在搜索中找到,但也许我没有在 Google 上使用正确的搜索字词。

我想规范化一个数字列。当我使用mutate(across(.., scale)) 修改该列时,我将[,1] 添加到标题中。这是为什么呢?

library(dplyr, warn.conflicts = FALSE)

mtcars_mpg_only <-
  mtcars %>%
  as_tibble() %>%
  select(mpg)

mtcars_mpg_only %>%
  as_tibble() %>%
  mutate(across(mpg, scale))
#> # A tibble: 32 x 1
#>    mpg[,1]
#>      <dbl>
#>  1   0.151
#>  2   0.151
#>  3   0.450
#>  4   0.217
#>  5  -0.231
#>  6  -0.330
#>  7  -0.961
#>  8   0.715
#>  9   0.450
#> 10  -0.148
#> # ... with 22 more rows

但如果我使用不同的函数而不是 scale()(例如 log()),则列标题保持原样:

mtcars_mpg_only %>%
  as_tibble() %>%
  mutate(across(mpg, log))
#> # A tibble: 32 x 1
#>      mpg
#>    <dbl>
#>  1  3.04
#>  2  3.04
#>  3  3.13
#>  4  3.06
#>  5  2.93
#>  6  2.90
#>  7  2.66
#>  8  3.19
#>  9  3.13
#> 10  2.95
#> # ... with 22 more rows

事后我知道如何删除/重命名[,1],但我的问题是为什么要创建它?

【问题讨论】:

    标签: r dplyr scale


    【解决方案1】:

    这是因为 scale 返回一个矩阵,而 log 返回一个普通向量。 mpg[, 1] 实际上是 data.frame 中的一个矩阵。有关其值的定义,请参见 ?scale。

    class(scale(mtcars$mpg))
    ## [1] "matrix" "array" 
    
    class(log(mtcars$mpg))
    ## [1] "numeric"
    

    将矩阵转换为纯向量以避免这种情况,例如

    mtcars_mpg_only %>%
      mutate(across(mpg, ~ c(scale(.))))
    
    # or extracting first column
    mtcars_mpg_only %>%
      mutate(across(mpg, ~ scale(.)[, 1]))
    
    # or normalizing using mean and sd
    mtcars_mpg_only %>%
      mutate(across(mpg, ~ (. - mean(.)) / sd(.)))
    
    # or without across
    mtcars_mpg_only %>%
      mutate(mpg = c(scale(mpg)))
    
    # or using base R
    mtcars_mpg_only |>
      transform(mpg = c(scale(mpg)))
    

    【讨论】:

    • mtcars_mpg_only %&gt;% mutate(across(mpg, ~ as.numeric(scale(.x)))) 应该可以工作
    • @DonaldSeinen 实际上就像mtcars_mpg_only %&gt;% mutate(across(mpg, ~ c(scale(.)))),不是吗?
    • 当然。任何一个都可以。
    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多