Forum Discussion
A generalisation of the MAP lambda helper function
- Sep 08, 2024
This is a demonstration of the proposed MAP function used to solve a challenge provided by Oz_Sunray and Wyn Hopkins on data cleansing and vote counting. The key element of my solution is to build a table of validated votes for each voter ID and each candidate (i.e. an array of arrays - much the same as any other problem of interest). The formula is modularised using Lambda functions. They are not that pretty, but neither are they impossible to follow.
"Worksheet formula" = AggregateVotesλ( tblVOTES[VoterID], tblVOTES[[Vote1]:[Vote3]], weight, tblAvailable[AVAILABLE] )which calls
/* "FUNCTION NAME: AggregateVotesλ" "DESCRIPTION: Aggregates all votes to candidate colors" */ /* "REVISIONS: Date Developer Description" " 08 Sep 2024 Peter Bartholomew Original Development" */ AggregateVotesλ = LAMBDA(voterID, votesCast, weight, available, LET( person, TOROW(UNIQUE(voterID)), votes, MAPλ(person, AssignVotesλ(voterID, votesCast, weight, available)), count, HSTACK(available, BYROW(votes, SUM)), return, TAKE(SORT(count, 2, -1), 4), return ) );to build and aggregate the table of votes. This, in turn, calls another Lambda function to clean and validate the votes corresponding to a single voterID
/* "FUNCTION NAME: AssignVotesλ" "DESCRIPTION: Validates and assigns votes to candidate colors for a single voterID " */ /* "REVISIONS: Date Developer Description" " 08 Sep 2024 Peter Bartholomew Original Development" */ AssignVotesλ = LAMBDA(voterID, ballots, weight, available, LAMBDA(p, LET( // "In the case of duplicate ballots return first" votesCast, XLOOKUP(p, voterID, ballots), // "Remove invalid and repeated votes" valid, COUNTIFS(available, votesCast), distinct, EXPAND(UNIQUE(FILTER(votesCast, valid), TRUE), , 3, ""), // "Assign votes to candidate colours" assigned, BYROW((distinct = available) * weight, SUM), assigned ) ) );I took the problem from Wyn's recording
https://www.youtube.com/watch?v=FIcxyLqzWcE
I've been playing around with this explicit references quirk to better understand the Mapλ function. The issue seems to be with the "Second array". The odd thing is the result of the formula varies by sheet.
=MAPλ(firstArray,LAMBDA(v,v*KroneckerProduct!F3:H6))The further I get away from the first sheet (KorneckerProduct), the more returns I get. Additionally, I was receiving occasional circular reference errors by using the above formula in the KorneckerProduct sheet. Enabling iterative calculations had no effect on the result.
I was able to get the formula to return the desired results on the 6th test sheet.
I fully recalculated a few times to make sure this wasn't a fluke. The results held but after more testing the results reverted to being wrong again (but no 0s). I'm wondering if this more of Excel not being coded to handle this particular situation?
Patrick2788 , PeterBartholomew1 ,
Yes, circular references appeared for me as well. I'm not sure is it worth to dig deeper now due to different behaviour on Beta and stable channels. Let take simple function
F = LAMBDA(a, fn, MAP(a, fn));
On Beta we have
On Current same formula works correctly
With absolute reference both work.