R 将数据缩放回其原始值

R descale data back to their original values

我有以下可重现的数据:

MyScaledData 包含 6 个变量的 0 到 1 之间的缩放值。 minvecmaxvec 是命名向量,包含用于创建缩放数据框 MyScaledData 的原始数据集中的最大值和最小值。 minvecmaxvec 包含原始数据集的所有 22 个变量的值,包括我现在在 MyScaledData.

中的 6 个变量
 X14863    X15066    X15067     X15068    X15069    X15070
 0.6014784 0.6975109 0.5043208 0.15284648 0.9416364 0.7860731
 0.2495215 0.7801444 0.6683925 0.13768245 0.4277954 0.2058412
 0.6167705 0.3344044 0.9254125 0.12777565 0.3826231 0.2590457
 0.1227380 0.4448501 0.3961802 0.19117246 0.7789835 0.7587897
 0.7299760 0.6375931 0.5760061 0.44746838 0.3634903 0.1079679
 0.1988647 0.7814712 0.6572054 0.71409305 0.6715690 0.4029459
 0.5041371 0.6374958 0.9333635 0.89057831 0.5716711 0.7219823
 0.5774327 0.7677038 0.7622717 0.45288270 0.2817869 0.2572325
 0.6809509 0.6089656 0.8191862 0.01151454 0.2780449 0.4655353
 0.5754383 0.5662045 0.7003630 0.62559642 0.2865510 0.1847980

MyScaledData<-structure(list(X14863=c(0.601478444979532,0.249521497274968,0.616770466379489,0.122737966507165,0.729975993009922,0.198864661389536,0.504137054265617,0.577432671357089,0.680950947164095,0.575438259547452),X15066=c(0.697510926657699,0.780144354632397,0.334404422875259,0.444850091405716,0.637593061483412,0.781471212351781,0.637495834667556,0.7677038048039,0.608965550162107,0.566204459603197),X15067=c(0.50432083998529,0.668392530333367,0.925412484830622,0.396180214305286,0.576006062451239,0.657205387087382,0.933363470346907,0.762271729415789,0.819186151914183,0.700362991098644),X15068=c(0.152846483002917,0.137682446305942,0.127775652495726,0.191172455317975,0.447468375530484,0.714093046059637,0.890578310935752,0.452882699805154,0.011514536383708,0.625596417031532),X15069=c(0.94163636689763,0.427795395079331,0.38262308941233,0.77898345642139,0.363490265569212,0.671568951210917,0.571671115989958,0.281786881885636,0.278044876559552,0.286551022600823),X15070=c(0.786073059382553,0.205841229942702,0.259045736299276,
0.758789694211416,0.107967864736275,0.402945912782515,0.721982268066207,0.257232456508833,0.46553533255268,0.184798001614338)),row.names=c(NA,10L),class="data.frame"); minvec<-c(X14861=22.95,X14862=29.95,X14863= 39.95,X15066=59.95,X15067=79.95,X15068=14.99,X15069=24.99,X15070=33.45,X15071=36.95,X15072=44.95,X15073=54.95,X15074=74.95,X15132=12.95,X15548=12.95,X15549=22.95,X15550=29.95,X15551=39.95,X15552=59.95,X15553=79.95,X15956=49.95,X15957=49.95,X16364=3.5);maxvec<-c(X14861=29.99,X14862=39.99,X14863=49.99,X15066=79.99,X15067=99.99,X15068=19.99,X15069=29.99,X15070=39.99,X15071=49.99,X15072=59.99,X15073=79.99,X15074=99.99,X15132=19.99,X15548=19.99,X15549=29.99,X15550=39.99,X15551=49.99,X15552=79.99,X15553=99.99,X15956=59.99,X15957=59.99,X16364=9.99)

我想通过将 min/max 值与基于名称的每个对应列相匹配,将 MyScaledData 重新缩放到它们的原始比例。我尝试了以下方法:

descale <- function(x,minval,maxval) {x*(maxval-minval) + minval}
as.data.frame(Map(descale,MyScaledData,minvec,maxvec))

我得到的输出比 MyScaledData 多了 6 列。我感觉到该函数甚至没有按名称匹配列,因此输出计算不正确。如何按列名匹配函数,以便它为每一列采用相应的 minvec 和 maxvec 元素,并且 return 只有我拥有的 6 列?

所需的输出应为:

MyDeScaledData <- structure(list(X14863 = c(45.9888435875945, 42.4551958326407,46.1423754824501, 41.1822891837319, 47.2789589698196, 41.9466012003509,45.0115360248268, 45.7474240204252, 46.7867475095275, 45.7274001258564), X15066 = c(73.9281189702203, 75.5840928668332, 66.6514646344202,68.8647958317706, 72.7273649521276, 75.6106830955297, 72.7254165267378,75.3347842482702, 72.1536696252486, 71.2967373704481), X15067 = c(90.0565896333052,93.3445863078807, 98.4952661960057, 87.8894514946779, 91.4931614915228,93.1203959572311, 98.654603945752, 95.2259254574924, 96.3664904843602,93.9852743416168), X15068 = c(15.7542324150146, 15.6784122315297,15.6288782624786, 15.9458622765899, 17.2273418776524, 18.5604652302982,19.4428915546788, 17.2544134990258, 15.0475726819185, 18.1179820851577), X15069 = c(29.6981818344881, 27.1289769753967, 26.9031154470616,28.8849172821069, 26.8074513278461, 28.3478447560546, 27.8483555799498,26.3989344094282, 26.3802243827978, 26.4227551130041), X15070 = c(38.5909178083619,34.7962016438253, 35.1441591153973, 38.4124846001427, 34.1561098353752,36.0852662695976, 38.171764033153, 35.1323002655678, 36.4946010748945,34.6585789305578)), row.names = c(NA, 10L), class = "data.frame")

感谢@Shirin Yavari 提供解决方案:

MyDeScaledData<-as.data.frame(Map(descale,MyScaledData,minvec[names(MyScaledData)],maxvec[names(MyScaledData)]))