User Profile
Chris_Gross
Joined 6 years ago
User Widgets
Recent Discussions
LAMBDA Examples: Count words in a text string
This post is the second of a series where we will be sharing out examples of lambdas. This is intended to highlight lambdas we have cooked up that show the power of this new super-charged function. Additionally, you have the opportunity to engage with us on the lambdas you have built yourself and of course let us know how our own formulas could be improved. If you didn’t catch the announcement, be sure to check out the blog post highlighting the release of this new function: LAMBDA In today’s example we will be creating a lambda which allows you to count how many words are in a text string. I find myself making use of this formula all the time when I need to do text scrubbing or fact checking I have edited my data correctly. Hopefully, if you’re like me and find yourself making use of this formula from time to time, it gives you a more repeatable way to call it without having to write all the logic from scratch. Count words in a text string For this example, lets start with the problem we have at hand and would like to abstract as a custom function. Below you can see a series of text strings which I have picked for this example. Breaking the problem down, what we are looking to do is find individual words in our sentence, but, what makes something a word? Well, naively speaking, we know that there is a word because there is a space before and/or after a series of characters. Because of this, we can count the length of our string with and without spaces and then subtract the two. This should give us a valid count of how many “words” are in our text string. To prove this, lets take a simple example of “Sally Jumps.”. In this text string the counts are as follows and generally speaking the LEN function is good for this: Calculation Result Formula CountOfLength 12 =LEN("Sally Jumps.") CountOfLengthWithoutSpaces 11 =LEN("SallyJumps.") With those two values calculated, we can simply subtract the LengthWithoutSpaces from the CountofLength and that will give us the value 1. Now you might be thinking... “OK, we get 1, but that is wrong… There are clearly 2 words in that sentence!”. You would be correct and with this calculation, we will always be off by 1. This is a simple thing to fix and important to remember when authoring our final formula. In summary, the formula we are going to build roughly looks like this: =COUNTOFLENGTH(<text string>) – COUNTOFLENGTH(<text string with no spaces>) + 1 The next thing to consider is how we can calculate a version of our text with no whitespaces and thankfully there is a formula for that! To remove whitespaces from our text string, we can use the SUBSTITUTE function to search for any spaces: " " and replace them with nothing: "" .The formula would look like the following. =SUBSTITUTE("Sally Jumps.", " ", "") If we take that formula and replace it with the "SallyJumps." portion of CountOfLengthWithoutSpaces we can calculate this without modifying the original string! =LEN(SUBSTITUTE("Sally Jumps.", " ", "")) With both problems completed, we can now begin to construct the final version of our formula. Putting together the intermediate calculations we created, (and assuming our text-string lives in A1) gives us the following solution: =LEN(A1) – LEN(SUBSTITUTE(A1, " ", "")) + 1 Moving along, all that is left to do, is encode this formula as a LAMBDA so we can use it later without having to think through this problem again! In this case, our LAMBDA will only take one input, the text string, and will need to define two names within the LET that map to our intermediate calculations. The formula looks like the following: =LAMBDA(textString, LET( countOfLength, LEN(textString), countOfLengthWithoutSpaces, LEN(SUBSTITUTE(textString, " ", "")), countOfLength - countOfLengthWithoutSpaces + 1 )) With our formula complete, some of you may have realized there is still one thing which could go wrong with our calculations and something we forgot to consider. What I am referring to is the case where there might be extra spaces included at the end of our text string. For example, if I had the text string, "Sally Jumps. ", our formula would return an improper count and as such, it is necessary for us to remove any leading or trailing whitespace. To prove this, we would get the following counts if we used our current solution on the problematic text string. Calculation Result Formula CountOfLength 17 =LEN("Sally Jumps. ") CountOfLengthWithoutSpaces 11 =LEN(SUBSTITUTE("SallyJumps. ", " ", "")) This would ultimately return the value 7! There are definitely less than 7 words in that sentence… Thankfully, since we made us of LET and have abstracted many of our calculations away, it becomes trivial to modify our solution. Additionally, if we happened to be using this in many places, we don’t have to track them down since, with LAMBDA, our formula is defined once and reused 😊 Moving along, the final thing we need to do to fix this, is make use of the TRIM function. TRIM removes leading and trailing spaces from a string. We can then make sure we call TRIM on textString before passing it into other calculations. There are a few ways you can re-author the above formula, but my solution looks like this: =LAMBDA(_textString, LET( textString, TRIM(_textString), countOfLength, LEN(textString), countOfLengthWithoutSpaces, LEN(SUBSTITUTE(textString, " ", "")), countOfLength - countOfLengthWithoutSpaces + 1 )) And that's it! You can now store this formula in the name manager, give it a name and call your newly created function! (In this case I chose to name it COUNTWORDS) One last thing, I would like to point out, is how when I call the function, I make use of a range as the input into my function! I think this is a pretty cool use of dynamic arrays and makes it so I don’t even have to do a fill down and duplicate my formula per row! We hope you found this example useful and look forward to seeing what lambdas you have cooked up on your own. Until next time! Chris Gross, Program Manager Excel7.7KViews1like2CommentsLAMBDA Examples: Distance between two cities
This post is the first of a series where we will be sharing out examples of lambdas. This is intended to highlight lambdas we have cooked up that show the power of this new super-charged function. Additionally, you have the opportunity to engage with us on the lambdas you have built yourself and of course let us know how our own formulas could be improved. If you didn’t catch the announcement, be sure to check out the blog post highlighting the release of this new function, Announcing LAMBDA: Turn Excel formulas into custom functions In today’s example we will be picking up where we left off in the announcement blog and making good on the promise of: “a custom function that takes two cities as input and calculates the distance between them...” So let’s get to it! Distance between two cities The first thing to note is that this function will be making use of Excel Data Types. Data Types are useful here because of the ease at which we can retrieve latitude and longitude for a given entity through “dot notation”. The next thing to cover is the mathematical formula which we will be encoding as an excel formula. We will be making use of the law of cosines which can give you an as the crow flies distance calculation. This formula is a great one to encode as a lambda given its complexity which will make it more prone to formula-authoring errors. It also happens to re-use multiple inputs which makes it a great candidate for LET. In short, this is the type of function I would want to author once and store for re-use. The equation looks like this: While this might seem a bit daunting, the inputs we really care about are: Latitude and longitude of the start location Latitude and longitude of the end location In the equation Δλ is the delta of the longitudes (_lon2 - _lon1) φ1 and φ2 represent _lon1 and _lon2 respectively r is equal to the radius of the sphere, in this case 6378 which is the radius of the earth in kilometers. The last trick we employ in this example is to convert everything into radians which is where we make use of the LET function to do these transformations. This is important as the equation expects lat/long in radians and the Data Types return them in degrees. This is illustrated in the first series of name definitions where we: Calculate the values in terms of radians for re-use Assign new names to differentiate between the input values (_lat1, _lon1, _lat2, _lon2) and transformed values (lat_1, lat_2, lon_1, lon_2) Putting all those concepts together gives us the following solution for LATLONGDISTANCE which will be doing the heavy-lifting for the final formula that takes in cities and passes in their respective latitudes and longitudes to LATLONGDISTANCE. =LATLONGDISTANCE =LAMBDA(_lat1, _lon1, _lat2, _lon2, LET( lat_1, RADIANS(_lat1), lon_1, RADIANS(_lon1), lat_2, RADIANS(_lat2), lon_2, RADIANS(_lon2), r, 6378, ACOS( (SIN(lat_1) * SIN(lat_2)) + (COS(lat_1) * COS(lat_2) * COS(lon_2-lon_1)) ) * r )) =ASTHECROWFLIES The last piece of the puzzle is to create a lambda which will take two cities as inputs. You could encode all of this into the previous formula, but we like the composability of lambdas and figured it would be a great way to show lambdas calling one another. Revisiting the previous comment, about extracting properties from data types, we will need to define something which takes two cities as inputs and then extracts the latitudes and longitudes. For this we will make use of dot notation and LET. =LAMBDA(city1, city2, LET( lat_1, city1.Latitude, lon_1, city1.Longitude, lat_2, city2.Latitude, lon_2, city2.Longitude, )) With the values extracted and names defined, the last thing to do is define a calculation which we call distance that returns the value. You’ll notice we wrap this in an IFERROR to catch any errors which might result from passing in bad values. =LAMBDA(city1, city2, LET( lat_1, city1.Latitude, lon_1, city1.Longitude, lat_2, city2.Latitude, lon_2, city2.Longitude, distance, LATLONGDISTANCE(lat_1, lon_1, lat_2, lon_2), IFERROR(distance, "an error occurred") )) And that's it! We hope you found this example useful and look forward to seeing what lambdas you have cooked up on your own. Until next time! Chris Gross, Program Manager Excel45KViews9likes34Comments
Recent Blog Articles
Spreadsheets in Space just became more powerful with a new API in Microsoft Excel
We are always looking for new ways to help people do more and create new experiences, so the Excel team was excited to collaborate with CCP Games as they developed a powerful new Excel add-in that wi...31KViews1like1Comment