>我有一个包含数百列的数据帧,我想将这些列重新缩放为 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))
这应该有效
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
这是你想要的吗?
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