【问题标题】:Excel, SAS, Python, factor level combinationExcel、SAS、Python、因子水平组合
【发布时间】:2018-01-04 19:41:32
【问题描述】:

我有 4 个因素 A B C D,每个因素都有不同的级别,命名为
A1 A2 B1 B2 B3 C1 C2 C3 D1 D2 D3 D4 我怎样才能得到每个级别的因素组合:A1B1C1D1 A1B1C1D2 A1B1C1D3 A1B1C1D4 A2 B1 C1D1 .....等。这种组合应该有 2x3x4x4。

我可以使用 Excel、SAS 或 Python,但我不知道解决方案。谢谢你的建议。

【问题讨论】:

  • 我建议您使用statsmodels olspatsy language 来编码线性模型。如果您在执行此操作时遇到困难,请随时在 StackOverflow 上提出有关此问题的具体问题。
  • 如果您要创建设计矩阵,那么我建议您使用 SAS PROC GLMMOD 来为您创建矩阵。
  • 哦,如果您在 SAS 中运行模型,有一些方法可以指定所有这些交互,而无需使用速记符号实际创建所有不同的可能组合。如前所述,这个问题并没有足够的信息来回答。

标签: python excel sas combinations


【解决方案1】:

在 SAS 中

data want;
format A B C D $2.;
format combination $8.;
do aa=1 to 2;
   A = catt("A",aa);
   do bb=1 to 3;
      B = catt("B",bb);
      do cc=1 to 3;
         C = catt("C",cc);
         do dd=1 to 5;
            D = catt("D",dd);
            combination=catt(A,B,C,D);
            output;
         end;
      end;
   end;
end;
drop aa bb cc dd;
run;

【讨论】:

    【解决方案2】:

    使用 Excel VBA:

    Sub user()
        ZZ = 1
        For i = 1 To 4
            For j = 1 To 4
                For k = 1 To 4
                    For l = 1 To 4
                        Cells(ZZ, 1) = "A" & i & "B" & j & "C" & k & "D" & l
                        ZZ = ZZ + 1
                    Next l
                Next k
            Next j
        Next i
    End Sub
    

    将产生所有 256 个项目:

    【讨论】:

      【解决方案3】:

      如果您在列表中收集所有级别名称,例如:

      data=['A1', 'A2' ,'B1' ,'B2', 'B3' ,'C1' ,'C2' ,'C3' ,'D1' ,'D2', 'D3' ,'D4']
      

      现在,如果您使用此代码在列表中查找唯一元素:

      track={}
      for i in data:
          if int(list(i)[1]) not in track:
              track[int(list(i)[1])]=[i]
          else:
              track[int(list(i)[1])].append(i)
      

      最后只需使用带有 r=len(unique_elements) , r = length tuples 的 itertools 生成组合

      import itertools
      
      print(list(itertools.combinations(data,r=len(track))))
      

      完整代码:

      data=['A1', 'A2' ,'B1' ,'B2', 'B3' ,'C1' ,'C2' ,'C3' ,'D1' ,'D2', 'D3' ,'D4']
      
      track={}
      for i in data:
          if int(list(i)[1]) not in track:
              track[int(list(i)[1])]=[i]
          else:
              track[int(list(i)[1])].append(i)
      
      
      
      import itertools
      
      print(list(itertools.combinations(data,r=len(track))))
      

      输出:

      ('A1', 'A2', 'B1', 'B2'), ('A1', 'A2', 'B1', 'B3'), ('A1', 'A2', 'B1', 'C1'), ('A1', 'A2', 'B1', 'C2'), ('A1', 'A2', 'B1', 'C3')....
      

      【讨论】:

        【解决方案4】:

        在 Python 中:

        for a in range(1,3):
           for b in range(1,4):
              for c in range(1,5):
                 for d in range(1,5):
                    print "A%d B%d C%d D%d" % (a,b,c,d)
        

        您还可以将因子的名称和级别数放在列表中,并使用递归函数:

        factors = ['A', 'B', 'C', 'D']
        levels = [2, 3, 4, 4]
        
        def recurse(i, combination):
           if i < len(factors):
              for level in range(1, levels[i]+1):
                 concat = factors[i] + str(level)
                 recurse(i+1, combination+concat)
           else:
              print combination
        
        recurse(0, '')
        

        您甚至可以在因子列表中包含级别名称,如下所示:

        factorlist = [['A', '1', '2'], ['B', '1', '2', '3'], ['C', '1', '2', '3', '4'], ['D', '1', '2', '3', '4']]
        
        def recurse(i, combination):
           if i < len(factorlist):
              for level in range(1, len(factorlist[i])):
                 concat = factors[i][0] + factorlist[i][level]
                 recurse(i+1, combination+concat)
           else:
              print combination
        
        recurse(0, '')
        

        【讨论】:

        • 或者... for levels in itertools.product(range(1,3), range(1,4), range(1,5), range(1, 5)): print('A{} B{} C{} D{}'.format(*levels)... ?
        • 我试用了产品,效果很好! @Jon,乔斯请看乔恩的回答。
        猜你喜欢
        • 1970-01-01
        • 2014-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-12
        • 1970-01-01
        • 2014-11-14
        • 2018-12-07
        相关资源
        最近更新 更多