使用不同的变量范围将变量从 0 标准化为 1?
Normalize variables from 0 to 1 with different range of variables?
我有这样一个数据框:
df <- data.frame(x1=c(1, 2, 3, 2, 1),
x2=c(1, 10, 5, 8, 3))
我正在尝试将两个变量标准化为 0 和 1 之间的值。因此 x1
中的 2 将为 0.5,x2
中的 5 也将为 0.5。
我试过使用以下归一化函数:
range01 <- function(x){(x-min(x, na.rm = T))/(max(x, na.rm = T)-min(x, na.rm = T))}
df <- range01(df)
但是它通过整个数据帧的范围(1 到 10)对所有变量进行归一化,给出:
x1 x2
0.0000000 0.0000000
0.1111111 1.0000000
0.2222222 0.4444444
0.1111111 0.7777778
0.0000000 0.2222222
如何根据各自的范围对两列进行标准化?我需要一个系统的函数来执行此操作,因为我在 for 循环中处理许多数据帧中的许多变量。
我认为你可以一行完成:
sapply(df, function(x) (x - min(x, na.rm = T)) / (max(x, na.rm = T) - min(x, na.rm=T)))
x1 x2
[1,] 0.0 0.0000000
[2,] 0.5 1.0000000
[3,] 1.0 0.4444444
[4,] 0.5 0.7777778
[5,] 0.0 0.2222222
基数 R:
apply(df, 2, function(x) {(x - min(x, na.rm = T))/(max(x, na.rm = T) - min(x, na.rm = T))})
x1 x2
[1,] 0.0 0.0000000
[2,] 0.5 1.0000000
[3,] 1.0 0.4444444
[4,] 0.5 0.7777778
[5,] 0.0 0.2222222
或 dplyr
:
df %>%
mutate_at(vars(starts_with("x")),
funs((. - min(., na.rm = T))/(max(., na.rm = T) - min(., na.rm = T)))) #Applying the function to vars that starts with "x"
x1 x2
1 0.0 0.0000000
2 0.5 1.0000000
3 1.0 0.4444444
4 0.5 0.7777778
5 0.0 0.2222222
或不同的 dplyr
解决方案,将函数应用于所有列:
df %>%
mutate_all(funs((. - min(., na.rm = T))/(max(., na.rm = T) - min(., na.rm = T))))
或 data.table
:
setDT(df)[ , lapply(.SD, function(x) (x - min(x, na.rm = T))/(max(x, na.rm = T) - min(x, na.rm = T)))]
x1 x2
1: 0.0 0.0000000
2: 0.5 1.0000000
3: 1.0 0.4444444
4: 0.5 0.7777778
5: 0.0 0.2222222
另一个基于 scales 包的选项
library("scales")
df <- data.frame(x1=c(1, 2, 3, 2, 1),
x2=c(1, 10, 5, 8, 3))
sapply(df, rescale)
默认选项是 0-1 范围,但您也可以传递其他范围(例如 0-100)
sapply(df, rescale, to = c(0, 100))
我有这样一个数据框:
df <- data.frame(x1=c(1, 2, 3, 2, 1),
x2=c(1, 10, 5, 8, 3))
我正在尝试将两个变量标准化为 0 和 1 之间的值。因此 x1
中的 2 将为 0.5,x2
中的 5 也将为 0.5。
我试过使用以下归一化函数:
range01 <- function(x){(x-min(x, na.rm = T))/(max(x, na.rm = T)-min(x, na.rm = T))}
df <- range01(df)
但是它通过整个数据帧的范围(1 到 10)对所有变量进行归一化,给出:
x1 x2
0.0000000 0.0000000
0.1111111 1.0000000
0.2222222 0.4444444
0.1111111 0.7777778
0.0000000 0.2222222
如何根据各自的范围对两列进行标准化?我需要一个系统的函数来执行此操作,因为我在 for 循环中处理许多数据帧中的许多变量。
我认为你可以一行完成:
sapply(df, function(x) (x - min(x, na.rm = T)) / (max(x, na.rm = T) - min(x, na.rm=T)))
x1 x2
[1,] 0.0 0.0000000
[2,] 0.5 1.0000000
[3,] 1.0 0.4444444
[4,] 0.5 0.7777778
[5,] 0.0 0.2222222
基数 R:
apply(df, 2, function(x) {(x - min(x, na.rm = T))/(max(x, na.rm = T) - min(x, na.rm = T))})
x1 x2
[1,] 0.0 0.0000000
[2,] 0.5 1.0000000
[3,] 1.0 0.4444444
[4,] 0.5 0.7777778
[5,] 0.0 0.2222222
或 dplyr
:
df %>%
mutate_at(vars(starts_with("x")),
funs((. - min(., na.rm = T))/(max(., na.rm = T) - min(., na.rm = T)))) #Applying the function to vars that starts with "x"
x1 x2
1 0.0 0.0000000
2 0.5 1.0000000
3 1.0 0.4444444
4 0.5 0.7777778
5 0.0 0.2222222
或不同的 dplyr
解决方案,将函数应用于所有列:
df %>%
mutate_all(funs((. - min(., na.rm = T))/(max(., na.rm = T) - min(., na.rm = T))))
或 data.table
:
setDT(df)[ , lapply(.SD, function(x) (x - min(x, na.rm = T))/(max(x, na.rm = T) - min(x, na.rm = T)))]
x1 x2
1: 0.0 0.0000000
2: 0.5 1.0000000
3: 1.0 0.4444444
4: 0.5 0.7777778
5: 0.0 0.2222222
另一个基于 scales 包的选项
library("scales")
df <- data.frame(x1=c(1, 2, 3, 2, 1),
x2=c(1, 10, 5, 8, 3))
sapply(df, rescale)
默认选项是 0-1 范围,但您也可以传递其他范围(例如 0-100)
sapply(df, rescale, to = c(0, 100))