我之前问了一个类似的问题,但我的输入文件很难处理,所以我再次问这个问题(希望这些文件更容易使用!)我正在尝试使用python因为这就是我现在想要学习的东西! (或者这可能直接在终端?!)
使用9701个细菌名称的一个数据集,我使用两个不同的程序对它们进行聚类。这些程序的输出(在一些操作之后)产生了两个文本文件,每个程序一个,看起来像这样:
0 Pyrobaculum aerophilum Thermoproteaceae
1 Mycobacterium aichiense Mycobacteriaceae
1 Mycobacterium alvei Mycobacteriaceae
1 Mycobacterium aromaticivorans Mycobacteriaceae
1 Mycobacterium aubagnense Mycobacteriaceae
1 Mycobacterium boenickei Mycobacteriaceae
1 Mycobacterium brisbanense Mycobacteriaceae
该数字对应于细菌被放入的簇,然后是细菌的实际名称(因此,上面有一个细菌群集'0',六个群集'1')。
我的问题:我想比较两个文件的输出,看看他们是否/如何对细菌进行不同的分类。理想情况下,我会生成一个具有这些差异的新文件。问题在于两个程序以不同的方式处理数据;因此,虽然两个程序产生的聚类可能含有相同的细菌,但实际的“聚类数”可能不同(例如,聚类'10'中有10个布鲁氏菌,而同样的10个布鲁氏菌属于聚类'2321' )。就我的目的而言,如果相同的细菌在一起,但群集号在两个群集文本文件之间发生变化:这并不重要。但是,如果一个程序将十个Brucella放在集群'10'中,但集群'2321'中只有9个 - 我想知道!)
那么,是否可以比较这两个文本文件,以便不查看实际的簇编号,但内容是否保持不变?
注意:如果更容易使用,我很容易将我的两个群集文件更改为此格式:
Brucella pinnipedialis Brucellaceae 0
Brucella suis Brucellaceae 0
Brucella ceti Brucellaceae 0
或者也许以其他方式?
答案 0 :(得分:1)
假设每个细菌只在一个簇中,您可以在它包含的第一个(字母)细菌后重命名每个簇。相同的群集将具有相同的名称,因此您可以直接进行比较。
答案 1 :(得分:1)
好的,如果是我,我会尝试这样的事情:
def collector(fileIn):
d = {}
with open(fileIn, "r") as f:
for line in f:
clu, gen, spec, fam = line.split()
d.setdefault(gen, []).append((spec, fam))
return d
def compare_files(f1, f2):
d1 = collector(f1)
d2 = collector(f2)
for genus in d1:
try:
if len(d1[genus]) != len(d2[genus]):
print genus, "is different"
except:
print genus, "not found in file 2"
您可以在d1或d2中打印出不匹配的每个属的元组,以查看哪些元素丢失。比较密钥以查看两个文件中是否有任何一个属于遗传也是有帮助的(我只是假设他们不会)。
如果文件很大,你可以删除try / except以减少开销
希望有所帮助。另请注意,我没有在任何地方保存群集号。如果这很重要,那么也许你可以将(spec,fam,clu)附加到词典中。
代码中编辑拼写错误