-4

我之前问过一个与此类似的问题,但我的输入文件很难使用,所以我再次问这个问题(希望这些文件更容易使用!)我正在尝试使用 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 个布鲁氏菌,而簇“2321”中有相同的 10 个布鲁氏菌)。出于我的目的,如果相同的细菌在一起,但簇号在两个簇文本文件之间发生了变化:那并不重要。但是,如果一个程序将十个布鲁氏菌放在集群“10”中,但集群“2321”中只有 9 个 - 我想知道!)

那么,是否可以比较这两个文本文件,以便不查看实际的簇号,但内容是否保持不变?

注意:如果更容易使用,将我的两个集群文件更改为这种格式很容易:

Brucella pinnipedialis Brucellaceae 0
Brucella suis Brucellaceae 0
Brucella ceti Brucellaceae 0

或者也许以其他方式?

4

2 回答 2

1

假设每个细菌只在一个簇中,您可以在每个簇包含的第一个(按字母顺序排列的)细菌之后重命名每个簇。相同的集群将具有相同的名称,因此您可以直接比较。

于 2013-08-13T19:17:09.953 回答
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) 附加到字典中。

编辑代码中的错字

于 2013-08-13T19:50:34.777 回答