Нормализовать переменные от 0 до 1 с другим диапазоном переменных? - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть кадр данных, подобный этому:

df <- data.frame(x1=c(1, 2, 3, 2, 1),
                 x2=c(1, 10, 5, 8, 3))

И я пытаюсь нормализовать обе переменные между 0 и 1. Так что 2 в x1 будет 0,5, а 5 в x2 будеттакже будет 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.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

С базой 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
0 голосов
/ 02 декабря 2018

Другая опция, основанная на пакете весов

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))
0 голосов
/ 01 декабря 2018

Я думаю, что вы можете сделать в одной строке:

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
...