【问题标题】:Rescale multiple columns at once in R在 R 中一次重新缩放多列
【发布时间】:2020-02-07 14:37:56
【问题描述】:

我有一个包含数百列的数据框,我想根据所有列的最小值/最大值将这些列重新调整为 0 到 1 之间。

我的数据如下所示:

a<-c(1, 3, 4, 6, 8.7, 9, 10, 12, 19.3, 20)
b<-c(10, 30, 40, 60, 87, 90, 100, 120, 190, 200)
df<-data.frame(a=a, b=b)
> df
      a   b
1   1.0  10
2   3.0  30
3   4.0  40
4   6.0  60
5   8.7  87
6   9.0  90
7  10.0 100
8  12.0 120
9  19.3 190
10 20.0 200

所以这里最小值为 1,最大值为 200。

我喜欢这个功能,但它只能应用于矢量:

rescale(*df*, to = c(0, 1), from = range(*df[,1:2]*, na.rm = TRUE, finite = TRUE))

【问题讨论】:

标签: r


【解决方案1】:

这应该可以工作

lapply(df, function(x) scale(x, center = FALSE, scale = max(x, na.rm = TRUE)/100)))

编辑:

如果您的目标是使用任何列的最大值作为重新缩放的参考,您可以执行以下操作:

lapply(df, function(x) scale(x, center = FALSE, scale = max(df, na.rm = TRUE)/100))

您的列将采用以下值:

a
       [,1]
 [1,]  0.50
 [2,]  1.50
 [3,]  2.00
 [4,]  3.00
 [5,]  4.35
 [6,]  4.50
 [7,]  5.00
 [8,]  6.00
 [9,]  9.65
[10,] 10.00
attr(,"scaled:scale")
[1] 2

b
       [,1]
 [1,]   5.0
 [2,]  15.0
 [3,]  20.0
 [4,]  30.0
 [5,]  43.5
 [6,]  45.0
 [7,]  50.0
 [8,]  60.0
 [9,]  95.0
[10,] 100.0

这是你想要的吗?

【讨论】:

  • 谢谢,但它不起作用.. 事实上,比例应该基于所有想要的列 df[,1:2] (min/max) 的范围,而不是单独缩放它们
  • 我改了答案,希望我能正确理解你想要得到的东西
【解决方案2】:
mx <- max(df)
mn <- min(df)
(df - mn) / (mx - mn)

            a          b
1  0.00000000 0.04522613
2  0.01005025 0.14572864
3  0.01507538 0.19597990
4  0.02512563 0.29648241
5  0.03869347 0.43216080
6  0.04020101 0.44723618
7  0.04522613 0.49748744
8  0.05527638 0.59798995
9  0.09195980 0.94974874
10 0.09547739 1.00000000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多