gpt4 book ai didi

r - 为什么 `mutate(across(...))` 和 `scale()` 将 [,1] 添加到列标题?

转载 作者:行者123 更新时间:2023-12-05 01:55:04 28 4
gpt4 key购买 nike

这似乎太基础了,无法在搜索中找到,但也许我没有在 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],但我的问题是为什么要创建它?

最佳答案

这是因为 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)))

关于r - 为什么 `mutate(across(...))` 和 `scale()` 将 [,1] 添加到列标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70377294/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com