Also creating all possible combinations like Jon Spring's solution but using data.table package and removing dupe applicant.
If your real-life dimensions are per OP, you can consider expanding to all possible combinations and remove rows where an applicant is duplicated:
library(data.table)
g20 <- c("a","b","c","d","e","f")
g30 <- c("a","b","c","d","e","f","g","h")
g40 <- c("c","d","e","f","g","h")
g50 <- c("e","f","g","h")
scen <- paste0("g", c(30, 30, 20, 20))
allcombi <- do.call(CJ, mget(scen))
setnames(allcombi, paste0("V", 1L:length(allcombi)))
#remove rows with applicants that are repeated in different columns
nodupe <- allcombi[
allcombi[, .I[anyDuplicated(unlist(.SD)) == 0L],
by=1:allcombi[,.N]]$V1]
#sort within columns with the same percentage of work
for(cols in split(names(nodupe), scen))
nodupe[, (cols) := sort(.SD), by=seq_len(nodupe[,.N]), .SDcols=cols]
#remove identical combinations
ans <- unique(nodupe)
setnames(ans, scen)[]
output:
g30 g30 g20 g20
1: a b c d
2: a b c e
3: a b c f
4: a b d e
5: a b d f
---
221: g h c e
222: g h c f
223: g h d e
224: g h d f
225: g h e f
Code & results from running for all 6 scenarios:
scenarios <- list(c(50,50),
c(50,30,20),
c(40,40,20),
c(40,30,30),
c(40,20,20,20),
c(30,30,20,20))
lapply(scenarios,
function(scen) {
scen <- paste0("g", scen)
allcombi <- do.call(CJ, mget(scen, envir=.GlobalEnv))
setnames(allcombi, paste0("V", 1L:length(allcombi)))
nodupe <- allcombi[
allcombi[, .I[anyDuplicated(unlist(.SD)) == 0L],
by=1:allcombi[,.N]]$V1]
for(cols in split(names(nodupe), scen))
nodupe[, (cols) := sort(.SD), by=seq_len(nodupe[,.N]), .SDcols=cols]
ans <- unique(nodupe)
setnames(ans, scen)[]
})
output:
[[1]]
g50 g50
1: e f
2: e g
3: e h
4: f g
5: f h
6: g h
[[2]]
g50 g30 g20
1: e a b
2: e a c
3: e a d
4: e a f
5: e b a
---
128: h g b
129: h g c
130: h g d
131: h g e
132: h g f
[[3]]
g40 g40 g20
1: c d a
2: c d b
3: c d e
4: c d f
5: c e a
6: c e b
7: c e d
8: c e f
9: c f a
10: c f b
11: c f d
12: c f e
13: c g a
14: c g b
15: c g d
16: c g e
17: c g f
18: c h a
19: c h b
20: c h d
21: c h e
22: c h f
23: d e a
24: d e b
25: d e c
26: d e f
27: d f a
28: d f b
29: d f c
30: d f e
31: d g a
32: d g b
33: d g c
34: d g e
35: d g f
36: d h a
37: d h b
38: d h c
39: d h e
40: d h f
41: e f a
42: e f b
43: e f c
44: e f d
45: e g a
46: e g b
47: e g c
48: e g d
49: e g f
50: e h a
51: e h b
52: e h c
53: e h d
54: e h f
55: f g a
56: f g b
57: f g c
58: f g d
59: f g e
60: f h a
61: f h b
62: f h c
63: f h d
64: f h e
65: g h a
66: g h b
67: g h c
68: g h d
69: g h e
70: g h f
g40 g40 g20
[[4]]
g40 g30 g30
1: c a b
2: c a d
3: c a e
4: c a f
5: c a g
---
122: h d f
123: h d g
124: h e f
125: h e g
126: h f g
[[5]]
g40 g20 g20 g20
1: c a b d
2: c a b e
3: c a b f
4: c a d e
5: c a d f
6: c a e f
7: c b d e
8: c b d f
9: c b e f
10: c d e f
11: d a b c
12: d a b e
13: d a b f
14: d a c e
15: d a c f
16: d a e f
17: d b c e
18: d b c f
19: d b e f
20: d c e f
21: e a b c
22: e a b d
23: e a b f
24: e a c d
25: e a c f
26: e a d f
27: e b c d
28: e b c f
29: e b d f
30: e c d f
31: f a b c
32: f a b d
33: f a b e
34: f a c d
35: f a c e
36: f a d e
37: f b c d
38: f b c e
39: f b d e
40: f c d e
41: g a b c
42: g a b d
43: g a b e
44: g a b f
45: g a c d
46: g a c e
47: g a c f
48: g a d e
49: g a d f
50: g a e f
51: g b c d
52: g b c e
53: g b c f
54: g b d e
55: g b d f
56: g b e f
57: g c d e
58: g c d f
59: g c e f
60: g d e f
61: h a b c
62: h a b d
63: h a b e
64: h a b f
65: h a c d
66: h a c e
67: h a c f
68: h a d e
69: h a d f
70: h a e f
71: h b c d
72: h b c e
73: h b c f
74: h b d e
75: h b d f
76: h b e f
77: h c d e
78: h c d f
79: h c e f
80: h d e f
g40 g20 g20 g20
[[6]]
g30 g30 g20 g20
1: a b c d
2: a b c e
3: a b c f
4: a b d e
5: a b d f
---
221: g h c e
222: g h c f
223: g h d e
224: g h d f
225: g h e f