Home » Creating a Recruitment Plan from Headcount

Creating a Recruitment Plan from Headcount

Create a Recruitment plan from the Projected Headcount. 1st hire = 1st month of projected headcount. e.g. Clerk’s count start on Mar-22 (2 clerks) next hire Jun-22 (6 -2= 4 clerks) Dynamic array function allowed, but Extra marks for Legacy Solutions or PowerQuery Solutions. Edit: Note For accountant: March 22 is 2 hires instead of 1

📌 Challenge Details and Links
Challenge Number: 50
Challenge Difficulty: ⭐⭐
📥Download Sample File
📥Link to the solutions on LinkedIn

Solving the challenge of Creating a Recruitment Plan from Headcount with Power Query

Power Query solution 1 for Creating a Recruitment Plan from Headcount, proposed by Omid Motamedisedeh:
let
  Source = Excel.CurrentWorkbook(){[Name = "HeadCount"]}[Content], 
  Un = Table.Distinct(
    Table.UnpivotOtherColumns(Source, {"Position"}, "Month", "Value"), 
    {"Position", "Value"}
  ), 
  Add = Table.AddColumn(
    Un, 
    "Hire", 
    each [Value]
      - (
        try
          Table.Last(Table.SelectRows(Un, (x) => x[Value] < _[Value] and x[Position] = _[Position]))[
            Value
          ]
        otherwise
          0
      )
  ), 
  remove = Table.RemoveColumns(Add, {"Value"})
in
  remove
Power Query solution 2 for Creating a Recruitment Plan from Headcount, proposed by Zoran Milokanović:
let
  Source = Table.UnpivotOtherColumns(
    Excel.CurrentWorkbook(){[Name = "HeadCount"]}[Content], 
    {"Position"}, 
    "Month", 
    "Hire"
  ), 
  R = Table.ToRows(Source), 
  S = Table.FromRows(
    List.TransformMany(
      R, 
      each 
        let
          c = List.PositionOf(R, _), 
          P = R{c - 1}
        in
          {{0}, {0}, {P{2}}, {}}{List.PositionOf({c = 0, _{0} <> P{0}, _{2} <> P{2}, true}, true)}, 
      (i, _) => {i{0}, i{1}} & {i{2} - _}
    ), 
    Table.ColumnNames(Source)
  )
in
  S
Power Query solution 3 for Creating a Recruitment Plan from Headcount, proposed by Kris Jaganah:
let
  A = Excel.CurrentWorkbook(){[Name = "HeadCount"]}[Content], 
  B = Table.UnpivotOtherColumns(A, {"Position"}, "Month", "CHire"), 
  C = Table.Group(
    B, 
    {"Position"}, 
    {
      "All", 
      (w) =>
        Table.AddColumn(
          w, 
          "Hire", 
          each try [CHire] - w[CHire]{List.PositionOf(w[Month], [Month]) - 1} otherwise [CHire]
        )
    }
  ), 
  D = Table.ExpandTableColumn(C, "All", {"Month", "Hire"}), 
  E = Table.SelectRows(D, each [Hire] > 0)
in
  E
Power Query solution 4 for Creating a Recruitment Plan from Headcount, proposed by Alejandro Simón 🇵🇦 🇪🇸:
let
  Source = Excel.CurrentWorkbook(){[Name = "HeadCount"]}[Content], 
  Group = Table.Group(
    Source, 
    {"Position"}, 
    {
      {
        "A", 
        each 
          let
            a = _, 
            b = Table.DemoteHeaders(a), 
            c = List.Select({{"B", 0}} & List.Skip(Table.ToColumns(b)), each _{1} <> null), 
            d = List.Transform({1 .. List.Count(c) - 1}, each {c{_}{0}, c{_}{1} - c{_ - 1}{1}}), 
            e = List.Select(d, each _{1} <> 0), 
            f = Table.FromRows(e, {"Moth", "Hire"})
          in
            f
      }
    }
  ), 
  Sol = Table.ExpandTableColumn(Group, "A", Table.ColumnNames(Group[A]{0}))
in
  Sol
Power Query solution 5 for Creating a Recruitment Plan from Headcount, proposed by Brian Julius:
let
  Source = Excel.CurrentWorkbook(){[Name = "HeadCount"]}[Content], 
  UnpivOth = Table.UnpivotOtherColumns(Source, {"Position"}, "Attribute", "Value"), 
  Group = Table.Group(UnpivOth, {"Position"}, {{"All", each _}}), 
  AddPrev = Table.AddColumn(
    Group, 
    "Prev", 
    each [
      a = [All], 
      b = {"Position", "Month", "Value", "Prev"}, 
      c = {0} & List.RemoveLastN(a[Value], 1), 
      d = Table.ToColumns(a) & {c}, 
      e = Table.FromColumns(d, b), 
      f = Table.AddColumn(e, "Hire", each [Value] - [Prev]), 
      g = Table.SelectRows(f, each [Hire] <> 0)
    ][g]
  ), 
  Clean = Table.SelectColumns(AddPrev, "Prev"), 
  Exp = Table.ExpandTableColumn(Clean, "Prev", {"Position", "Month", "Hire"})
in
  Exp
Power Query solution 6 for Creating a Recruitment Plan from Headcount, proposed by 🇮🇷 Navid Esmaeilzadeh اسماعیل زاده:
let
  S = Excel.CurrentWorkbook(){[Name = "HeadCount"]}[Content], 
  A = Table.UnpivotOtherColumns(S, {"Position"}, "Month", "Hire"), 
  B = Table.Group(A, {"Position"}, {{"T", each _}}), 
  F = (T) =>
    let
      a = Table.AddIndexColumn(T, "I", 0, 1), 
      b = Table.AddColumn(a, "Hire.", each try [Hire] - a[Hire]{[I] - 1} otherwise [Hire]), 
      c = Table.SelectRows(b, each ([#"Hire."] <> 0)), 
      d = Table.SelectColumns(c, {"Month", "Hire."})
    in
      d, 
  C = Table.AddColumn(B, "F", each F([T])), 
  D = Table.SelectColumns(C, {"Position", "F"}), 
  E = Table.ExpandTableColumn(D, "F", {"Month", "Hire."}, {"Month", "Hire."})
in
  E
Power Query solution 7 for Creating a Recruitment Plan from Headcount, proposed by Peter Krkos:
let
  Ad_H = Table.AddColumn(
    Source, 
    "H", 
    each [
      a = List.Accumulate(
        List.Skip(Record.FieldNames(_)), 
        {{null, null, 0}}, 
        (st, cur) =>
          if Record.Field(_, cur) = List.Last(st){2} or Record.Field(_, cur) is null then
            st
          else
            st & {{cur, Record.Field(_, cur) - List.Last(st){2}, Record.Field(_, cur)}}
      ), 
      b = List.Transform(List.Skip(a), (x) => {[Position]} & List.FirstN(x, 2))
    ][b], 
    type list
  ), 
  Combined = Table.FromRows(
    List.Combine(Ad_H[H]), 
    type table [Position = text, Month = text, Hire = Int64.Type]
  )
in
  Combined
Power Query solution 8 for Creating a Recruitment Plan from Headcount, proposed by Nelson Mwangi:
let
  Source = Excel.CurrentWorkbook(){[Name = "HeadCount"]}[Content], 
  Unpivot = Table.UnpivotOtherColumns(Source, {"Position"}, "Month", "H"), 
  Group = Table.Group(
    Unpivot, 
    {"Position"}, 
    {
      {
        "All", 
        each 
          let
            AddIndex = Table.AddIndexColumn(_, "Index", 0, 1), 
            AddPrevious = Table.AddColumn(
              AddIndex, 
              "Hire", 
              each if [Index] = 0 then [H] else [H] - AddIndex[H]{[Index] - 1}
            ), 
            Filter = Table.SelectRows(AddPrevious, each [Hire] <> 0)
          in
            Filter
      }
    }
  ), 
  Expand = Table.ExpandTableColumn(Group, "All", {"Month", "Hire"})
in
  Expand

Solving the challenge of Creating a Recruitment Plan from Headcount with Excel

Excel solution 1 for Creating a Recruitment Plan from Headcount, proposed by Bo Rydobon 🇹🇭:
=LET(
   n,
   C4:I8,
   y,
   n-IFNA(
       HSTACK(
           0,
           n),
       ),
   L,
   LAMBDA(
       x,
       TOCOL(
           IFS(
               y,
               x),
           3)),
   HSTACK(
       L(
           B4:B8),
       L(
           C3:I3),
       L(
           y)))
Excel solution 2 for Creating a Recruitment Plan from Headcount, proposed by Kris Jaganah:
=LET(
   a,
   B4:B8,
   b,
   C3:I3,
   c,
   C4:I8,
   d,
   TOCOL(
       a&"-"&b),
   e,
   TEXTSPLIT(
       d,
       "-"),
   f,
   --TEXTAFTER(
       d,
       "-"),
   g,
   INDEX(
       c,
       MATCH(
           e,
           a,
           0),
       MATCH(
           f,
           --b,
           0)),
   h,
   IF(
       e=VSTACK(
           "",
           DROP(
               e,
               -1)),
       g-VSTACK(
           @g,
           DROP(
               g,
               -1)),
       g),
   FILTER(
       HSTACK(
           e,
           f,
           h),
       h>0))
Excel solution 3 for Creating a Recruitment Plan from Headcount, proposed by Julian Poeltl:
=LET(
   T,
   C4:I8,
   H,
   TOCOL(
       T-IFNA(
           HSTACK(
               0,
               DROP(
                   T,
                   ,
                   -1)),
           0)),
   W,
   WRAPROWS(
       TEXTSPLIT(
           TEXTJOIN(
               ";",
               ,
               FILTER(
                   HSTACK(
                       TOCOL(
                           B4:B8&";"&C3:I3),
                       H),
                   H>0)),
           ";"),
       3),
   VSTACK(
       HSTACK(
           "Position",
           "Month",
           "Hire"),
       IFERROR(
           W*1,
           W)))
Excel solution 4 for Creating a Recruitment Plan from Headcount, proposed by Hussein SATOUR:
=LET(
   S,
   SEQUENCE,
   C,
   TOCOL,
   a,
   HSTACK(
       C(
           B4:B8&IF(
               S(
                   ,
                   7),
               "")),
       C(
           C3:I3&IF(
               S(
                   5),
               "")),
       C(
           C4:I8-IF(
               ISTEXT(
                   B4:H8),
               0,
               B4:H8))),
   FILTER(
       a,
       INDEX(
           a,
           ,
           3)>0))
Excel solution 5 for Creating a Recruitment Plan from Headcount, proposed by Oscar Mendez Roca Farell:
=LET(
   n,
    C4:I8-N(
        +B4:H8),
    TEXTSPLIT(
        CONCAT(
            TOCOL(
                IFS(
                    n,
                     B4:B8&"|"&C3:I3&"|"&n),
                 2)&"_"),
         "|",
         "_",
         1))
Excel solution 6 for Creating a Recruitment Plan from Headcount, proposed by Hamidi Hamid:
=LET(
   x,
   TOCOL(
       DROP(
           IFERROR(
               -B4:I8+C4:I8,
               C4:I8),
           ,
           -1)),
   y,
   TOCOL(
       IFNA(
           B4:B8,
           C3:I3)),
   z,
   TOCOL(
       IFNA(
           C3:I3,
           B4:B8)),
   t,
   VSTACK(
       {"Position",
       "Month",
       "Hire"},
       HSTACK(
           y,
           z,
           x)),
   FILTER(
       t,
       TAKE(
           t,
           ,
           -1)>0))
Excel solution 7 for Creating a Recruitment Plan from Headcount, proposed by ferhat CK:
=LET(
   r,
   DROP(
       REDUCE(
           0,
           A2:A6,
           LAMBDA(
               x,
               y,
               VSTACK(
                   x,
                   LET(
                       a,
                       XMATCH(
                           y,
                           A2:A6),
                       w,
                       CHOOSEROWS(
                           B2:H6,
                           a),
                       b,
                       UNIQUE(
                           w,
                           TRUE),
                       c,
                       XLOOKUP(
                           b,
                           w,
                           B1:H1),
                       IFERROR(
                           HSTACK(
                               y,
                               TOCOL(
                                   c),
                               TOCOL(
                                   b-HSTACK(
                                       0,
                                       DROP(
                                           b,
                                           ,
                                           -1)))),
                           y))))),
       1),
   FILTER(
       r,
       TAKE(
           r,
           ,
           -1)))
Excel solution 8 for Creating a Recruitment Plan from Headcount, proposed by Ankur Sharma:
=TEXTSPLIT(
   TEXTJOIN(
       ", ",
        ,
       
       BYROW(
           B4:I8,
            LAMBDA(
                r,
                
                LET(
                    Po,
                     TAKE(
                         r,
                          ,
                          1),
                    
                    J,
                     IF(
                         CHOOSECOLS(
                             r,
                              2) > 0,
                          Po & ":" & C3 & ":" & CHOOSECOLS(
                             r,
                              2),
                          ""),
                    
                    HC_2,
                     DROP(
                         r,
                          ,
                          2),
                    
                    HC_1,
                     DROP(
                         DROP(
                         r,
                          ,
                          1),
                          ,
                          -1),
                    
                    D,
                     HC_2 - HC_1,
                    
                    TEXTJOIN(
                        ", ",
                         ,
                         J,
                         IF(
                             D > 0,
                              Po & ":" & D3:I3 & ":" & D,
                              "")))))),
   
   ":",
    ", ")
Excel solution 9 for Creating a Recruitment Plan from Headcount, proposed by Imam Hambali:
=LET(
   
   v,
    HeadCount[[Jan-22]:[Jul-22]]-HSTACK(
        HeadCount[Jan-22]*0,
        DROP(
            HeadCount[[Jan-22]:[Jul-22]],
            ,
            -1)),
   
   l,
    LAMBDA(
        x,
         TOCOL(
             IF(
                 v>0,
                 x,
                 NA()),
             3)),
   
   VSTACK(
       Recruitment[
       hashtag
       #Headers],
        HSTACK(
            l(
                HeadCount[Position]),
             l(
                 HeadCount[[
                 hashtag
                 #Headers],
                 [Jan-22]:[Jul-22]]),
             l(
                 v)))
   )
Excel solution 10 for Creating a Recruitment Plan from Headcount, proposed by Eddy Wijaya:
=LET(
   
   adj_d,
   BYROW(
       B4:I8,
       LAMBDA(
           r,
           TEXTJOIN(
               ",",
               ,
               MAP(
                   r,
                   LAMBDA(
                       m,
                       IFERROR(
                           m-OFFSET(
                               m,
                               ,
                               -1),
                           m)))))),
   
   REDUCE(
       K3:M3,
       adj_d,
       LAMBDA(
           a,
           v,
           VSTACK(
               a,
               
               LET(
                   
                   i,
                   TEXTBEFORE(
                       v,
                       ","),
                   
                   n,
                   TEXTSPLIT(
                       TEXTAFTER(
                           v,
                           ",",
                           1),
                       ,
                       ","),
                   
                   c,
                   SEQUENCE(
                       COUNTA(
                           n)),
                   
                   m,
                   IFNA(
                       HSTACK(
                           i,
                           INDEX(
                               C3:I3,
                               ,
                               c),
                           --n),
                       i),
                   
                   FILTER(
                       m,
                       TAKE(
                               m,
                               ,
                               -1)>0))))))

Solving the challenge of Creating a Recruitment Plan from Headcount with Python

Python solution 1 for Creating a Recruitment Plan from Headcount, proposed by Konrad Gryczan, PhD:
import pandas as pd
from pandas.tseries.offsets import MonthEnd
path = "files/Excel Challenge Nov 3rd.xlsx"
input = pd.read_excel(path, usecols="B:I", skiprows=2, nrows=6)
test = pd.read_excel(path, usecols="K:M", skiprows=2, nrows=12).rename(columns=lambda x: x.replace('.1', ''))
input = input.melt(id_vars=input.columns[0], var_name="Month", value_name="HC")
input["HC"] = input["HC"].fillna(0)
input["Month"] = pd.to_datetime(input["Month"], format='%b-%y') + MonthEnd(0)
input["Hire"] = input.groupby("Position")["HC"].diff().fillna(input["HC"]).astype(int)
result = input[input["Hire"] > 0].drop(columns=["HC"]).sort_values(by=["Position", "Month"]).reset_index(drop=True)
print(result.equals(test))  # False, one value mistaken in challenge.

Solving the challenge of Creating a Recruitment Plan from Headcount with R

R solution 1 for Creating a Recruitment Plan from Headcount, proposed by Konrad Gryczan, PhD:
library(tidyverse)
library(readxl)
path = "files/Excel Challenge Nov 3rd.xlsx"
input = read_excel(path, range = "B3:I8")
test = read_excel(path, range = "K3:M15")
result = input %>%
 pivot_longer(cols = -c(1), names_to = "Month", values_to = "HC") %>%
 replace_na(list(HC = 0)) %>%
 mutate(Month = my(Month)) %>%
 mutate(Hire = HC - lag(HC, default = 0), .by = Position) %>%
 filter(Hire > 0) %>%
 select(-HC)
all.equal(result, test, check.attributes = FALSE) 
# False, one value is different. Mistake in construction of challenge.

Leave a Reply