I'm trying to do some bootstrapping with a data set in Excel with the formula =INDEX($H$2:$H$5057,RANDBETWEEN(2,5057)), where my original data set in is column H. It seems to work most of the time, but there is always approximately one cell that outputs a reference error. Does anyone know why this happens, or how to avoid including that one cell? I'm trying to generate a histogram from this data, and FREQUENCY does not play nice with an array with an error in it.
Please try:
=INDEX($H$2:$H$5057,RANDBETWEEN(1,5056))
=RANDBETWEEN(2,5057) returns a reasonably arbitrary value of 2 or any integer up to and including 5057. Used as above this specifies the position in the chosen array (H2:H5057) - that only has 5056 elements, so one problem would be when RANDBETWEEN hits on 5057. Much easier to observe with just H2:H4 and RANDBETWEEN(2,4).
Related
I am trying to use the Match function to return the row of an indicated table that a certain time value is on. The time is in mm:ss format on the table, so I want users to input the desired time to match as text for their simplicity (with data validation to ensure its correct format), and then use the Time function within the Match function to convert the input to match the format of the table for comparison. However, when using the Time function, the Match function returns the incorrect row, one row number short of what it should be to be precise. I attempted to do some debugging (shown below) and looked into the documentation of both the Time and Match functions, but can't figure out why this would happen. Is there something about the Time function I'm missing?
Here is a breakdown of what I'm using and what I've done to debug and figure out it's the Time function that's causing me issues. Column R has the functions I've been using and their results, and Column S has direct links to the table to show what the output should be. Column T shows that the time values are exactly the same but that using them yields different results in the Match function. Column U is the user input time in text format, and columns V through X are just used to ensure we get to the correct column in the lookup table.
(https://i.stack.imgur.com/ageCW.png)
Here is a snip of the table being referenced in the Match function.
(https://i.stack.imgur.com/FgfGG.png)
Well, this is curious. This is NOT a proper answer, but I needed to enter this as an answer rather than a comment because I needed the space and the markup of a table. I created my own table and ran my own experiment.
I entered the time value of 00:01:23 three different ways:
I typed "00:01:23" into a cell manually.
I entered =TIME(0,1,23) in a cell
I typed "00:01:15" and "00:01:16" into two consecutive cells, and then dragged it down and let Excel autofill.
Here's the results I got:
How Entered
Value
Typed "00:01:23" in Excel
0.0009606481481481480000
=TIME(0,1,23)
0.0009606481481481480000
Fill
0.0009606481481481490000
I emphasized the digit that turned out unexpectedly different.
I then did a MATCH(x,x,1) down this column for each value and it resulted in exactly the behavior you observed. The first two matched 1:22, as they should, because they were ever so slightly less than the table value. The self-referencing MATCH() of the 1:23 cell correctly matched on 1:23.
What is puzzling to me is that my test revealed to me that the value in the lookup table was a tiny bit off, by (0.0000000000000000010000), where your test presented the exact same number, concealing the difference. So in my test, the MATCH() behaved correctly for the data given, even if the data was wrong.
Excel is limited to 15 significant digits, and I have no way of knowing what rounding shenanigans Excel goes through to drop the remaining digits.
My thought goes to wondering how the time values in your lookup table were first created to begin with. Like, were they initially entered in a google sheet and then opened in excel? Is the 15 significant digit rounding handled identically among excel versions and OSes?
Working in Excel 2019. In the same realm as one of my previous questions, I'm working with a database that I'm trying to look through via functions to get my values. The VLOOKUP tool worked well for going through the time-table to find the value I need, but it's not working when I'm trying to find RPM as the look-up value. Here's the gist of the data.
We have Time(sec, A:A in "PPT_156Data" sheet), RPM (B:B in same sheet), and Pressure (Bar, C:C in same sheet).
From the graph, you can see that we ramp to 8000RPM over the course of around 60 seconds, and then ramp down to 0RPM over the next 30. Test times WILL vary and rates WILL vary from pump-to-pump, as each one will give different data values based on the pump. That's why, say, 1000RPM will not be in the same spot every time.
I'm trying to find the RPM at 1000 intervals up to 8000 and report out the pressure at said intervals.
Here's what I tried so far, with imagery as well.
'Disregard if you see W25 for S25, I had just been trying multiple things
First, I attempted the same VLOOKUP code I had done for the time-table prior
=VLOOKUP(S25,PPT156_Data!B:C,2,TRUE) 'S25 being lookup value
This worked fine, UP UNTIL it hit a particular spot. For some reason, as soon as it tries to find an approximate match for 6663RPM, it faults out and gives incorrect data. From then on, all the way to 8000RPM, it will ONLY give the result of 0.139BAR. I have no clue why. Trying to find that value in the return array gives multiple results, but it's not like it's the ONLY value left.
So, I tried to do a wildcard for it with the following code
=VLOOKUP("*"&S25&"*",PPT156_Data!B:C,2,FALSE) 'Attempted both False and True states
Gave N/A for both of the values. Not sure if I'm entering in the wildcard incorrectly here. The decimal places that the RPM can go to ranges between 2-5 (hundredths to hundred-thousandths, IE 7000.00750)
I then thought maybe an Index Match would work.
=INDEX(PPT156_Data!B:C,MATCH(S25,PPT156_Data!B:B,-1),2)
Tried that in wildcard format too, returned nothing. So, I decided to see if I could even match a value for RPM with the following attempts
=MATCH(S25,PPT_Data156!B:B,-1)
This gave nothing. HOWEVER, when setting the match specification to 1, it gives the very last row in the data set. So, I decided to find a value in column B, and attempt to match with it exactly.
=MATCH(7000.07,PPT_Data156!B:B,0)
This also returned nothing. Even though, you can see in my images, that the value is ABSOLUTELY there. SIGFIG shows it's 7000.1 but trust me, it's 7000.07. So that sort of threw me for a loop. Figuring maybe there was a different error and grasping at straws, tried another Index Match formula, this time subtracting the lookup value in an attempt to get it extremely close and absolute value/min it
=INDEX(PPT156_Data!C:C,MATCH(MIN(ABS(PPT156_Data!B:B-S25)),ABS(PPT156_Data!B:B-S25),1))
I'm at a loss. I'm not sure if because the rate ramps up and down, thus not being in ascending order, is causing a problem? I can't change that. I am thinking I may need to create a macro for this in some way? Maybe a helper table? But I can't even FIND the match value to create a helper table. Any help at all would be VERY appreciative.
Thank you for your time looking at my post.
I am presuming that you want the first pressure reading when the RPM hits above each 1000 interval. I got to a solution but feels a bit complex.
=index(C:C,1/max(iferror(1/(row(B:B)*(B:B>E12)),Null)))
Breaking this down, we create a boolean array where the RPM hits above the interval
=B:B>E12
and then we multiple this by the array of the rows of column B
row(B:B)*(B:B>E12)
which gives us an array of the row numbers when the RPM is above E12 but also zero for all the ones that do not.
=iferror(1/(row(B:B)*(B:B>E12)),Null)
We then force an error with the zeros by dividing and replace with null. We get the max since we inverse the row numbers and then inverse again to get the row number back.
=index(C:C,1/max(iferror(1/(row(B:B)*(B:B>E12)),Null)))
[Excel working screenshot][1]
[1]: https://i.stack.imgur.com/uhcaX.png
Alright this should be a simple one.
I apologize in case it has been already solved, but I can only find posts related to solving this issue with programming languages and not specifically to EXCEL.
Furthermore, I could find posts that address a sub-problem of my question (e.g. regarding limitation of certain EXCEL functions) and should solve/invalidate my request but maybe, just maybe, there is a workaround.
Problem statement:
I want to calculate the minimum value for each column in an EXCEL matrix. Simply enough, I want to input a 2D array (mxn matrix) in a function and output an array with dimension 1xm where each item is the minimum value MIN(nj) of each nj column.
However, I want to solve this with specific constraints:
Avoid using VBA and other non-function scripting: that I could devise myself;
All in one function: what I want to achieve here is to have one and one function only, not split the problem into multiple passages (such as for example copypasting a MIN() function below each column, that wouldn't do it);
The result should be a transposable array (which is already ok, I assume);
Where I am stranded with my solution so far:
The main issue here is that any function I am trying to use takes the entire matrix as a single array input and would calculate the MIN() of the entire matrix, not each column. My current (not working) function for an exemplary 4x4 matrix in range A1:D4 would be as below (the part in bold is where it is clearly not working):
=MIN(INDEX(A1:D4,SEQUENCE(4,4,1,1)))
which ofc does not work, because INDEX() does probably not "understand" SEQUENCE() as an array of items to take into account. Another, not working, way of solving this is to input a series of ranges (A1:A4;B1:B4;C1:C4;D1:D4) so that INDEX() "understands" the ranges as single columns, but ofc does not know and I do not know sincerely how to formulate that. I could use INDIRECT() in some way to reference the array of ranges, but do not know how and could find a way by searching online.
Fundamental question is: can a function, which works with single arrays, also work with multiple arrays? Basically, I do not know how to communicate an EXCEL array formula, that each batch of data I am inputting is a single array and must be evaluated separately (this is very easily solved with for() cycles, I know).
Many thanks for any suggestion and any workaround, any function and solution works as longs as it fits in the constrains defined above (maybe a LAMBA() function? don't know).
This is ofc a simplification of a way more complex problem (I am trying to calculate the annual mean temperature evolution for a specific location by finding the value - for each year from 1950 to 2021 - that is associated to the lat/lon coordinates that are the nearest to the one of the location inputted, given a netCDF-imported grid of time-arrayed data; the MIN() function is used to selected the nearest location, which is then used, via INDEX() to find temp data). I need to do this in one hit (meaning just pasting the function, which evaluates a matrix of data that is referenced by a fixed range), so that I can just use it modularly for other data sets. I already have a working solution, which is "elegant"* enough, but not "elegant"* as the one I could develop solving this issue.
*where "elegant"= it saves me one click every time for 1000+ datasets when applying the function.
If I understand your problem correct then this should solve it:
=BYCOL(A1:D4,LAMBDA(d,MIN(d)))
Basically I am trying to improve a spreadsheet that current uses fixed IF functions within IF functions to determine where to find data, then originally used the VLOOKUP function to return the appropriate cable cleat size. Where "Cleat Diameter">"Cable Diameter".
I've been using this for a while, however excel quickly runs out of resources with all the remaining calculations being performed. As a result, I've opted to put all data a single table, and try to use the match function to retrieve the necessary row. Then Simply use the =INDIRECT function to retrieve data from the appropriate column of the associated row.
Unfortunately I believe the issue relates to the fact that I first need to perform at MATCH Type 0 (exact match), followed by a type -1 for the size to identify the next size up that can accommodate a specific cable size.
I've managed a simple lookup on another dataset using (for exact matches):
=MATCH($B3,'Current Raw Data'!A:A,0)+ROW('Current Raw Data'!A:A)-1
However when I attempt the same thing with two types of matches I get errors. The closest I get it using the following array formula, but it does not work unless the data set is arranged so that the contents of Cell C3 is the first occurring item in the dataset in column A:A:
{=MATCH(C3,($B3='Lookup - Cleats'!A:A)*('Lookup - Cleats'!B:B),-1)}
Main sheet:
Dataset Example:
With this array formula (click Ctrl + Shift + Enter together inside formula bar), you should be able to get your results:
=IFERROR(INDEX('Lookup - Cleats'!C$3:C$26,MATCH($B3&$C3,'Lookup - Cleats'!$A$3:$A$26&'Lookup - Cleats'!$B$3:$B$26,0)),"")
I tried my best to use your data setup but maybe miss one or two things that you will need to adjust accordingly. Let me know if this is not working.
Does anyone know how I can get excel to look at the following fields, all formatted in mm:ss.00 and return the lowest time. I am using this to calculate PB's - personal best times - in a sports club race sheet.
The formula I am using is
=MIN(J5,(U5),(AE5),(AO5),(AY5),(BI5),(BS5),(CC5),(CM5),(CW5),(DG5),(DQ5),(EA5),(EK5),(EU5))
The problem I have at the moment is that it is including 00:00.00 values in the cells and returning a MIN value of 00:00.00.
Any suggestions would be welcomed.
many thanks
Nigel
Use the following:
=SMALL((J5,U5,AE5,AO5,...),COUNTIF((J5,U5,AE5,AO5,...),0)+1)
COUNTIF counts the amounts of 0 (you maybe need to adjust this value based on your formatting, but it should work). SMALL returns the n-smallest number of the given matrix, with n being the counted value + 1.
Therefore if no 0 is in the matrix, you get the 1st-smallest (aka the smallest), with one 0 you get the 2nd-smallest and so on. Maybe you need to add a check if every value is 0, if that could happen, as in that case SMALL would try to retrieve the value on position list_size+1 of the list, which of course isn't present.