我有一个问题,我有一个几百万行的文件,排列方式如下:
1 Protein_A
1 Protein_B
2 Protein_A
3 Protein_C
4 Protein_A
4 Protein_B
4 Protein_C
4 Protein_D
5 Protein_C
5 Protein_D其中第一列表示相互作用途径,第二列表示蛋白质的ID。有没有人能推荐一种有效的方法,我可以将其归入每个网络中仅有(非互惠的)相互作用的边缘列表中,例如:
1 Protein_A,Protein_B
4 Protein_A,Protein_B
4 Protein_A,Protein_C
4 Protein_A,Protein_D
4 Protein_B,Protein_C
5 Protein_C,Protein_D
5 Protein_C,Protein_D或者告诉我在哪里可以找到这样的数据?
我尝试了一个shell脚本,它缓慢地迭代文件,并删除文件末尾的新行,结果如下:
1 Protein_A 1 Protein_B然后可以将其加工成边缘,但是如果网络中有两个以上的蛋白质,这就不起作用。我一片空白。有人能帮帮忙吗?
提前谢谢你。
发布于 2016-09-20 03:01:41
使用python和一些智能模块相当容易。我已经将文件内容嵌入到一个字符串中。只需替换为data = open("input.txt")即可从文件中读取(也可迭代)。
我创建了一个字典,将数字作为关键字,将与数字匹配的蛋白质列表作为值。
构建完成后,我使用大小为2的itertools.combinations生成列表,并在生成过程中输出密钥。
import re
import collections,itertools
data="""1 Protein_A
1 Protein_B
2 Protein_A
3 Protein_C
4 Protein_A
4 Protein_B
4 Protein_C
4 Protein_D
5 Protein_C
5 Protein_D""".split("\n")
d = collections.defaultdict(lambda : list())
for l in data:
fields = re.split("\s+",l.strip())
d[int(fields[0])].append(fields[1])
for k,v in d.items():
for a,b in itertools.combinations(v,2):
print(k,a,b)结果:
(1, 'Protein_A', 'Protein_B')
(4, 'Protein_A', 'Protein_B')
(4, 'Protein_A', 'Protein_C')
(4, 'Protein_A', 'Protein_D')
(4, 'Protein_B', 'Protein_C')
(4, 'Protein_B', 'Protein_D')
(4, 'Protein_C', 'Protein_D')
(5, 'Protein_C', 'Protein_D')https://stackoverflow.com/questions/39580130
复制相似问题