我有一个类似下面的表格,我想计算不同的因素组合。示例所有存在的时间(1表示存在,0表示缺少)。第一时间缺席,但休息时间,第二时间缺席,但其他人在场,也为双打和三倍缺席和休息在场。
在shell中,检查所有存在的时间是相当简单的。
AWK“{ if((2美元=1))&(3美元=1)&&(4美元=1)&&(5美元=1)&&(6美元=1))打印$1 }
但问题是计算所有可能的组合。
桌子看起来像这样:

CEBP    HEB     TAL1    RUNX1   SPI1
1       1       1       1       1
0       1       1       1       1
1       1       0       0       1
1       1       1       1       0
0       0       0       1       1

现在这张桌子上出现了不同的组合
1个组合,所有组合都存在。
2首先缺席,其他人都在场
最后三个缺席,其他人在场
4、第三和第四缺席,但其他出席。
前三名缺席,但其他人在场。
在这样一个具有固定列数和n行数的表中,如何计算存在和不存在的这些组合?
请帮忙。
谢谢你

最佳答案

假设data包含您的数据,这可以完成以下工作:

with open("data") as f:
        lines=[line.strip().split() for line in f]
combinations={}
for combination in lines[1:]:
        key=", ".join([lines[0][i]
                for i in xrange(len(combination))
                if combination[i] != '0'])
        combinations[key]=combinations.setdefault(key, 0)+1
for key, value in combinations.iteritems():
        print value, '\t', key

或者,使用Collections模块:
import collections

with open("data") as f:
        lines=[line.strip().split() for line in f]

combinations=collections.Counter(
        ", ".join(lines[0][i]
                for i in xrange(len(combination))
                        if combination[i] != '0')
                for combination in lines[1:])

for key, value in combinations.iteritems():
        print value, '\t', key

编辑:另一个版本使用生成器表达式保存资源
import collections

with open("data") as f:
        lines=(line.strip().split() for line in f)
        header=next(lines)
        combinations=collections.Counter(
                ", ".join(header[i]
                        for i in xrange(len(combination))
                                if combination[i] != '0')
                        for combination in lines)
        for key, value in combinations.iteritems():
                print value, '\t', key

我相信这是可以改进的。

07-26 09:29
查看更多