【问题标题】:Generating all permutations when length varies当长度变化时生成所有排列
【发布时间】:2014-10-16 16:38:34
【问题描述】:

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

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

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

问题:我需要创建一个所有有效代码的列表,但我在策略上苦苦挣扎,因为排列可以是任意长度,我找不到这里提出的相关现有问题。我最初的意图是使用 R,但我欢迎任何能够获得完整列表的方式。那里有任何指示吗?

【问题讨论】:

    标签: r permutation variable-length


    【解决方案1】:

    我不确定您究竟需要怎样的输出,但这是可行的。将每个级别分配给一个变量,但添加一个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,])]
    

    【讨论】:

    • 我想这也应该给出类似的结果expand.grid(mget(ls(pattern="^L\\d+")))
    • 谢谢,太棒了!请注意,最后一行代码需要右括号 (])。
    • @spearmint 谢谢,已修复。
    • 还有来自“data.table”的CJ,虽然我不知道它在什么时候给你带来了性能优势(它不适用于这个示例数据)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-01-02
    相关资源
    最近更新 更多