根据当前文档,您应该使用基于
across
的语法来对所需子集的列执行操作。您可以使用
everything
来选择所有列,或者使用
任何其他可用限定词。如果您想对分组执行操作,请仅使用
group_by
动词。选择变量不是使用
group_by
的正确选择。
mtcars %>%
as_tibble() %>%
mutate(across(where(is.numeric), ~ . - mean(.)))
关于将某些列应用实际标准化或其他操作,您可以使用:
.fns 用于对所选列中的每一列应用的函数。可能的值为:
NULL
,返回未转换的列。
- 函数,例如
mean
。
- Purrr 样式匿名函数,例如
~ mean(.x, na.rm = TRUE)
- 函数/匿名函数列表,例如
list(mean = mean, n_miss = ~ sum(is.na(.x))
因此,对于 scale
,您可以执行以下操作:
mtcars %>%
as_tibble() %>%
mutate(across(where(is.numeric), scale))
或者使用额外参数。
mtcars %>%
as_tibble() %>%
mutate(across(where(is.numeric), scale, center = FALSE))
备注
从?scale
文档中可以看到,该函数返回矩阵。对于上面的示例,如果您只想得到一列矩阵,可以进行以下操作:
mtcars %>%
as_tibble() %>%
mutate(across(where(is.numeric), ~ scale(.)[,1]))
对比
>> mtcars %>%
... as_tibble() %>%
... mutate(across(where(is.numeric), ~ scale(.)[,1])) %>%
... glimpse()
Rows: 32
Columns: 11
$ mpg <dbl> 0.15088482, 0.15088482, 0.44954345, 0.21725341, -0.23073453, -0.33028740, -0.96078…
$ cyl <dbl> -0.1049878, -0.1049878, -1.2248578, -0.1049878, 1.0148821, -0.1049878, 1.0148821, …
$ disp <dbl> -0.57061982, -0.57061982, -0.99018209, 0.22009369, 1.04308123, -0.04616698, 1.0430…
$ hp <dbl> -0.53509284, -0.53509284, -0.78304046, -0.53509284, 0.41294217,
...
>>
>>
>> mtcars %>%
... as_tibble() %>%
... mutate(across(where(is.numeric), scale)) %>%
... glimpse()
Rows: 32
Columns: 11
$ mpg <dbl[,1]> <matrix[32 x 1]>
$ cyl <dbl[,1]> <matrix[32 x 1]>
$ disp <dbl[,1]> <matrix[32 x 1]>
$ hp <dbl[,1]> <matrix[32 x 1]>
...
as.data.frame(lapply(mtcars, function(x) x - mean(x)))
呢? - jay.sf