我很好奇人们可以通过"选择自己的冒险形式"完成培训的总数
例如,培训总共有 10 个不同的级别(即 1 级、2 级......10(.人们可以完成1:10;10:1;1,2,3,5,10;2,1,3,5,4,6,7,9,8,10;或在参加退出测试之前使用所有、部分或不使用任何级别的级别的任何组合。
我希望找到一种方法将这些组合变成一个分类变量,因为我想知道序列是否对用户通过退出测试的可能性很重要。
我想知道如何在 R 中做到这一点,但如果有人有其他创造性的解决方案可以提供关于使用序列作为变量的更好方法,我也全力以赴。
谢谢!
你可能想看看 expand.grid
dat <- expand.grid(1:10, 1:10)
library(tidyr)
unite(dat, perms = Var1, Var2, sep=".")
因为 1,2,3 不同于 3,2,1,所以您希望使用排列,而不是组合。
此外,目标向量的大小应在 1 到 10 之间(1,2 是可能的解决方案,从不包括 3(。
请注意,1:10 的所有排列可能需要一段时间。远高于 10 会增加时间和内存需求。以下是使用 3 个值进行操作的方法。
library(gtools)
library(data.table)
levelnum <- 3
lval <- lapply(1:levelnum, function(x) {
dat <- data.table(permutations(levelnum, x))
setnames(dat, as.character(1:x))})
dval <- rbindlist(lval, use.names = TRUE, fill = TRUE)
结果:
1 2 3
1: 1 NA NA
2: 2 NA NA
3: 3 NA NA
4: 1 2 NA
5: 1 3 NA
6: 2 1 NA
7: 2 3 NA
8: 3 1 NA
9: 3 2 NA
10: 1 2 3
11: 1 3 2
12: 2 1 3
13: 2 3 1
14: 3 1 2
15: 3 2 1
将levelnum
更改为 10 会导致 9864100 行。
1 2 3 4 5 6 7 8 9 10
1: 1 NA NA NA NA NA NA NA NA NA
2: 2 NA NA NA NA NA NA NA NA NA
3: 3 NA NA NA NA NA NA NA NA NA
4: 4 NA NA NA NA NA NA NA NA NA
5: 5 NA NA NA NA NA NA NA NA NA
---
9864096: 10 9 8 7 6 5 4 1 3 2
9864097: 10 9 8 7 6 5 4 2 1 3
9864098: 10 9 8 7 6 5 4 2 3 1
9864099: 10 9 8 7 6 5 4 3 1 2
9864100: 10 9 8 7 6 5 4 3 2 1
这需要几分钟才能运行。
您可以在Map
中使用combn
,然后unlist
来获取所有组合的列表。
res <- Map(combn, 10, 1:10, simplify = FALSE)
unlist(res, recursive = FALSE)