R语言:提取scale()的标准化值并去除附加属性的方法
提取scale()标准化数值并去除附加属性的方法
问题描述
使用scale()函数对多列数据做标准化处理后,新生成的列带有scaled:center和scaled:scale附加属性,如何只保留纯标准化数值、去掉这些属性?
原代码示例
set.seed(5) data.frame(x1 = runif(10, 1, 5), x2 = runif(10, 1, 5), x3 = runif(10, 1, 5)) |> mutate(across(.cols = num_range('x', 1:3), .fns = scale, .names = '{.col}_z')) |> str()
原运行结果
'data.frame': 10 obs. of 6 variables: $ x1 : num 2.71 3.45 2.91 3.67 1.09 ... $ x2 : num 3.33 1.74 2.91 2.05 4.26 ... $ x3 : num 1.9 1.44 4.6 1.07 1.68 ... $ x1_z: num [1:10, 1] -0.336 0.352 -0.155 0.559 -1.84 ... ..- attr(*, "scaled:center")= num 3.07 ..- attr(*, "scaled:scale")= num 1.08 $ x2_z: num [1:10, 1] 0.61 -1.006 0.181 -0.688 1.55 ... ..- attr(*, "scaled:center")= num 2.73 ..- attr(*, "scaled:scale")= num 0.985 $ x3_z: num [1:10, 1] -0.672 -0.973 1.079 -1.213 -0.816 ... ..- attr(*, "scaled:center")= num 2.94 ..- attr(*, "scaled:scale")= num 1.54
解决方案
scale()函数返回的是带属性的矩阵,只需将其转换为普通数值向量即可去除附加属性,以下是两种简洁实现方式:
方法1:用as.numeric()转换
将scale()的结果包裹在as.numeric()中,直接把矩阵转为数值向量:
set.seed(5) data.frame(x1 = runif(10, 1, 5), x2 = runif(10, 1, 5), x3 = runif(10, 1, 5)) |> mutate(across(.cols = num_range('x', 1:3), .fns = ~ as.numeric(scale(.x)), .names = '{.col}_z')) |> str()
方法2:用c()转换
利用c()函数的特性,将矩阵展开为数值向量:
set.seed(5) data.frame(x1 = runif(10, 1, 5), x2 = runif(10, 1, 5), x3 = runif(10, 1, 5)) |> mutate(across(.cols = num_range('x', 1:3), .fns = ~ c(scale(.x)), .names = '{.col}_z')) |> str()
修改后运行结果示例
'data.frame': 10 obs. of 6 variables: $ x1 : num 2.71 3.45 2.91 3.67 1.09 ... $ x2 : num 3.33 1.74 2.91 2.05 4.26 ... $ x3 : num 1.9 1.44 4.6 1.07 1.68 ... $ x1_z: num -0.336 0.352 -0.155 0.559 -1.84 0.433 0.666 0.695 0.08 -0.095 $ x2_z: num 0.61 -1.006 0.181 -0.688 1.55 -0.122 0.429 -0.323 -0.433 0.802 $ x3_z: num -0.672 -0.973 1.079 -1.213 -0.816 1.432 0.466 0.641 -0.073 0.139
可以看到,新生成的x1_z、x2_z、x3_z列已经是普通数值向量,不再带有任何附加属性。
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

