【问题标题】:Normalize variables from 0 to 1 with different range of variables?使用不同的变量范围将变量从 0 标准化为 1?
【发布时间】:2019-05-03 14:55:17
【问题描述】:

我有一个这样的数据框:

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 循环中处理许多数据帧中的许多变量。

【问题讨论】:

标签: r function normalization


【解决方案1】:

我认为你可以一行完成:

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

【讨论】:

  • sapply(df, range01)。赞成,但您忘记了 OP 的数据中似乎有 NA
【解决方案2】:

使用基础 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

【讨论】:

    【解决方案3】:

    另一个基于 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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-23
      • 2016-08-19
      • 2019-08-12
      • 1970-01-01
      • 2022-01-25
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多