【问题标题】:R descale data back to their original valuesR 将数据缩放回其原始值
【发布时间】:2019-09-13 12:55:50
【问题描述】:

我有以下可重现的数据:

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)

我想通过将最小/最大值与基于名称的每个对应列进行匹配,将 MyScaledData 重新调整为原始比例。我尝试了以下方法:

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

我得到的输出比 MyScaledData 多 6 列。我感觉该函数甚至没有按名称匹配列,因此输出计算不正确。如何按列名匹配函数,以便它为每列获取相应的 minvec 和 maxvec 元素并仅返回我拥有的 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")

【问题讨论】:

  • 数据没有列 minvec 和 maxvec 因此函数无法“匹配”它们。给定一两列,minvec 和 maxvec 指的是什么?
  • 正确,minvec 和 maxvec 是命名向量。在 MyData 有 2 列的场景中,该函数应匹配 minvec 和 maxvec 中的 2 列。
  • 您能否添加预期的输出应该是什么样的?
  • 如果我们制作 minvec 和 maxvec 数据帧会有帮助吗?
  • 将 as.data.frame(Map(descale,MyScaledData,minvec,maxvec)) 更改为 as.data.frame(Map(descale,MyScaledData,minvec[names(MyScaledData)],maxvec[names (MyScaledData)]))

标签: r scaling


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2018-08-29
    • 2021-12-09
    相关资源
    最近更新 更多