r - R - 创建多个场景组合
问题描述
我有四个(部分重叠)组,每组八个独特的申请人申请了我必须分配的工作的 20%、30%、40% 和 50%:
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")
因为我只能按这四个增量来奖励作品,而且我必须选择不少于两个不超过四个的人,所以我有六个场景来奖励 100% 的作品:
- 50/50
- 50/30/20
- 40/40/20
- 40/30/30
- 40/20/20/20
- 30/30/20/20
对于每个场景,我需要找到所有可能的组合(无需替换),以将工作授予相应组中的申请人。
对于第一个场景,我可以很容易地完成这一点,t(combn(g50,2))
但我不确定如何处理其他场景,我必须从不同的向量中提取组合,并确保在任何给定的组合中只选择一次申请人。输出需要是实际的组合,而不仅仅是组合的数量。
使用 R,我如何从四个不同的组中获取这些组合,并且(以场景 5 为例)确保“cdef”、“cedf”、“cfed”、“cfde”等都被视为相同的结果?
这可能吗?
解决方案
还创建所有可能的组合,例如 Jon Spring 的解决方案,但使用data.table包并删除欺骗申请人。
如果您的实际维度是每个 OP,您可以考虑扩展到所有可能的组合并删除重复申请人的行:
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)[]
输出:
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
运行所有 6 个场景的代码和结果:
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)[]
})
输出:
[[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
推荐阅读
- list - 解释为什么 append/3 在这些情况下会产生无限数量的解决方案
- nagios - Nagios:如何在服务 cfg 文件中应用手动更改
- powershell - 获取 ADUser Powershell 参数
- sql - 如何在 MS Access 中使用 UPDATE 和 JOIN
- swift - UITextView 减少某些字体的溢出
- java - 使 TitledBorder 不可见?
- c++ - 当类 T 和 T_ref 仅在构造函数和析构函数中不同时,如何优雅地避免代码重复?
- javascript - React Hook useEffect 缺少依赖项:'fetchTracker'。包括它或删除依赖数组
- php - 在 PHP 中使用 $_SESSION 显示错误数组
- python - 在脚本运行时扩展类功能