如何比较群集 2.0

2024-10-03 21:37:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的问题:我想比较两个文件的输出,看看它们对细菌的分类是否/如何不同。理想情况下,我会生成一个包含这些差异的新文件。在同一个簇中,细菌可能是两个不同的簇。就我而言,如果同一个细菌在一起,但是簇号发生变化,两个簇之间的文本文件:那就不重要了。但是,如果有一个程序把10个布鲁氏菌放在“10”簇中,而只有9个在“2321”簇中——我想知道!)在

那么,是否可以比较这两个文本文件,这样就不会看到实际的簇号,而是内容是否保持不变?在

注意:如果我的两个群集文件更易于使用,则可以很容易地将两个群集文件更改为以下格式:

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

或者以其他方式?在


Tags: 文件数据程序名称聚类群集文本文件航站楼
2条回答

好吧,如果是我,我会试试这样的方法:

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)。在

编辑键入代码

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

相关问题 更多 >