Forum Discussion

jasper1995's avatar
jasper1995
Copper Contributor
Sep 20, 2022

How to match a list of values to values from a predetermined list

Hi there,

 

For my thesis I need to do some data cleaning and I'm looking for a way to not have to do this by hand (tens of columns and hundreds of rows). The data I have needs to match a prespecified set of numbers, namely: 

256
128
64
32
16
8
4
2
1
0,5
0,25
0,13
0,06
0,03
0,02
0,01

The problem is a lot of the data in my database is values such as 0.022, 0.60, 0.10, etc. 

I'm looking for a way to convert these numbers to the nearest one from the list above. Rounding functions will not work since it's not a generic interval. I have tried vlookup and combinations of 'index' and 'match' but they all render #N/B for reasons unknown to me. 

 

Does anyone have an idea on how to tackle this? I would be much obliged!

  • jasper1995's avatar
    jasper1995
    Copper Contributor

    I managed to figure out a different way of doing it

    Matching number closest to X  
    ReferenceHalfway pointCutoffData inputMatched value
    256192191,9999990,0130,016
    1289695,9999990,0030,004
    644847,9999990,050,063
    322423,9999990,0250,031
    161211,9999990,0250,031
    865,99999998
    432,99999954
    21,51,4999990,0130,016
    10,750,7499990,0130,016
    0,5000,3750,3749990,2490,25
    0,2500,190,1899990,2510,25
    0,1300,09650,0964990,00000010
    0,0630,0470,0469990,0640,063
    0,0310,02350,023499200256
    0,0160,0120,011999130128
    0,0080,0060,0059990,002220,002
    0,0040,0030,002999 0
    0,0020,00150,001499 0
    0,0010,00050,00049900
    000  

     

    Columns are A through E.

    A is the reference column.

    B is the halfway point between two values in A.

    C is the cutoff point between two values in A minus 0,00001.

    D is the data column e.g. input.

    E is the output value e.g. value in D matched to reference in A.

     

    Managed to do it with this formula using the 'Cutoffs' as conditions for the 'IF' formula to use. I am curous if anyone can find flaws in this or whether I am overlooking anything. D3 is the cell it concerns as the input to be matched here.

     

     

    =IF(D3>$C$3;$A$3;IF(D3>$C$4;$A$4;IF(D3>$C$5;$A$5;IF(D3>$C$6;$A$6;IF(D3>$C$7;$A$7;IF(D3>$C$8;$A$8;IF(D3>$C$9;$A$9;IF(D3>$C$10;$A$10;IF(D3>$C$11;$A$11;IF(D3>$C$12;$A$12;IF(D3>$C$13;$A$13;IF(D3>$C$14;$A$14;IF(D3>$C$15;$A$15;IF(D3>$C$16;$A$16;IF(D3>$C$17;$A$17;IF(D3>$C$18;$A$18;IF(D3>$C$19;$A$19;IF(D3>$C$20;$A$20;IF(D3>$C$21;$A$21;0)))))))))))))))))))

     

     

    • dscheikey's avatar
      dscheikey
      Bronze Contributor

      jasper1995 

      Hello Jasper, yes, your formula also works. But you could also have rewritten my formula to INDEX() and MATCH(). XLOOKUP() is no longer so new. It is available from EXCEL 2016.

       

      =INDEX($A$3:$A$22,MATCH(TRUE,ABS($A$3:$A$22-D3)=MIN(ABS($A$3:$A$22-D3)),0))

       

  • DexterG_III's avatar
    DexterG_III
    Iron Contributor

    jasper1995 Here's a formula that will return the closes match in the reference list which is larger than the value looking up (column B below).  

     

    =INDEX($A$3:$A$18,MATCH(IF(B15>256,256,B15),$A$3:$A$18,-1),1)

     

    Hope this helps.  

     

    Dexter

     

     

    • dscheikey's avatar
      dscheikey
      Bronze Contributor

      DexterG_III 

      Hi Dexter your formula does not bring the desired result "nearest" but always the next higher value. My formula does it differently. Let's see which solution is the right one for jasper1995 .

      =XLOOKUP(TRUE,ABS($A$3:$A$18-B3)=MIN(ABS($A$3:$A$18-B3)),$A$3:$A$18)

       

    • jasper1995's avatar
      jasper1995
      Copper Contributor

      Thank you for the advice! Unfortunately as the other commenter said this still renders the next value up from, and not the nearest one.

       

      EDIT: it works, but when inserting a value of say 0,061 it wil render 0,13 instead of 0,06.

Resources