【问题标题】:How to compare clusters 2.0 [duplicate]如何比较集群 2.0 [重复]
【发布时间】:2013-08-14 04:08:23
【问题描述】:

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

或者以其他方式?

【问题讨论】:

  • 这是您的第三个明显相同的问题。您用来尝试自己解决此问题的代码有什么问题(您确实先尝试过,对吗?),或者您的其他两个问题的答案有什么问题?
  • @Marcin 这就是我在如何比较集群中承认“我再次问这个”的意思,我正在使用的文件非常尴尬,最终不是我应该的一起工作,所以我想再次询问“正确”文件:P :)
  • 再一次:您用来尝试自己解决此问题的代码有什么问题(您确实先尝试过,对吗?),或者您的其他两个问题的答案有什么问题?
  • 除非您遇到问题的部分只是解析输入,否则旧答案仍应适用。
  • 每个属都是独一无二的吗?我的意思是,假设你有集群 0,它有分枝杆菌属。该属还会有其他集群吗?

标签: python sorting


【解决方案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) 附加到字典中。

编辑代码中的错字

【讨论】:

  • :D 我现在就试试,谢谢!
  • 非常感谢,效果很好!
【解决方案2】:

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

【讨论】:

  • 这是个好主意,谢谢!
  • 根据文件的大小,如果您无法将它们全部读入内存,可能会采用这样的方法。
猜你喜欢
  • 2013-07-25
  • 2020-02-22
  • 1970-01-01
  • 2016-03-03
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2020-03-09
相关资源
最近更新 更多