我有一个类似下面的表格,我想计算不同的因素组合。示例所有存在的时间(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
我相信这是可以改进的。