如何比较集群2.0

时间:2013-08-13 19:06:50

标签: python sorting

我之前问了一个类似的问题,但我的输入文件很难处理,所以我再次问这个问题(希望这些文件更容易使用!)我正在尝试使用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

或者也许以其他方式?

2 个答案:

答案 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)附加到词典中。

代码中

编辑拼写错误