当长度变化时生成所有排列

时间:2014-10-16 16:38:35

标签: r permutation variable-length

背景:我正在使用定性数据编码方案,该方案包含七个有序级别的代码。其中五个包含一个选项,两个包含两个互斥选项。给定代码可以是最多七个组件代码的串联,但它们必须按级别的顺序发生(因此我们有排列而不是组合)。困难的部分是代码可能包含任意数量的级别,1-7。

等级1:A
等级2:B或C
3级:D或E
4级:F
5级:G
等级6:H
等级7:我

同样有效的示例代码:ABDFGHI,ACF,I,FGHI,ACE,FH

问题:我需要创建一个包含所有有效代码的列表,但由于排列可能有任何长度,因此我无法找到相关的现有问题。我最初的意图是使用R,但我可以获得完整列表的任何方式。有什么指针吗?

1 个答案:

答案 0 :(得分:4)

我不确定你的输出是什么,但是这样可行。将每个级别分配给变量,但为其添加NA。然后像这样使用expand.grid

L1<-c("A",NA)
L2<-c("B","C",NA)
L3<-c("D","E",NA)
L4<-c("F",NA)
L5<-c("G",NA)
L6<-c("H",NA)
L7<-c("I",NA)
expand.grid(L1=L1,L2=L2,L3=L3,L4=L4,L5=L5,L6=L6,L7=L7)

输出的每一行都是一个组合,但对于未包含的变量,它将包含NA。请注意,最后一行288全部为NA

注意,要获得不能使用NA的行(使用第283行作为示例):

Levels<-expand.grid(L1=L1,L2=L2,L3=L3,L4=L4,L5=L5,L6=L6,L7=L7)
Levels[283,][!is.na(Levels[283,])]