Forum Discussion

PeterBartholomew1's avatar
PeterBartholomew1
Silver Contributor
Sep 02, 2024
Solved

A generalisation of the MAP lambda helper function

Discussion topic.  Your thoughts are welcome.   On Saturday I finally bit the bullet and completed a MAPλ Lambda function that generalises the in-built MAP Lambda helper function.  As examples, I t...
  • PeterBartholomew1's avatar
    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

     

Resources