【问题标题】:How to transpose unique entries in a column and print values from another column如何转置列中的唯一条目并打印另一列中的值
【发布时间】:2022-11-12 05:25:52
【问题描述】:

我有一个包含两列的文件 input.txt,我想用“;”分割第二列并转置唯一条目,然后计算并列出第 1 列中有多少匹配项。

这是我的制表符分隔的 input.txt 文件

Gene     Biological_Process
BALF2   metabolic process
CHD4    cell organization and biogenesis;metabolic process;regulation of biological process
TCOF1   cell organization and biogenesis;regulation of biological process;transport
TOP1    cell death;cell division;cell organization and biogenesis;metabolic process;regulation of biological process;response to stimulus
BcLF1   0
BALF5   metabolic process
MTA2    cell organization and biogenesis;metabolic process;regulation of biological process
MSH6    cell organization and biogenesis;metabolic process;regulation of biological process;response to stimulus

我的预期输出1

Biological_Process  Gene
metabolic process   BALF2   CHD4    TOP1    BALF5   MTA2    MSH6
cell organization and biogenesis    CHD4    TCOF1   TOP1    MTA2    MSH6
regulation of biological process    CHD4    TCOF1   TOP1    MTA2    MSH6
transport   TCOF1
cell death  TOP1
cell division   TOP1
response to stimulus    TOP1    MSH6

【问题讨论】:

    标签: python awk


    【解决方案1】:

    您需要先解析所有数据,例如从一个空白字典开始,然后读取文件的每一行(如果它是标题,则跳过第 0 行)open your file ... iterate over each line,对于列 > 0 中的每个条目,为该字符串创建一个字典键,其值作为来自 column = 0 的字符串使用 splitstripdict[gene...] = process... 等字符串方法。然后从字典中打印/写出每个.items

    输入.txt

    gene process
    A cell org bio
    B cell bio
    C 0
    D org
    

    脚本.py

    #!/usr/bin/env python
    
    def main():
    
        pros = {}
    
        with open("input.txt", "r") as ifile:
            for line in ifile:
                cols = line.strip().split()
                if len(cols) >= 1:
                    for pro in cols[1:]:
                        if pro not in pros:
                            pros[pro] = []
                        pros[pro] += [cols[0]]
    
        with open("output.txt", "w") as ofile:
            for key,val in pros.items():
                ofile.writelines(f'{key}	' + '	'.join(val) + '
    ')
    
    if __name__ == "__main__":
        main()
    

    $ chmod +x ./script.py
    $ ./script.py
    $ cat ./output.txt
    

    输出.txt

    process gene
    cell    A       B
    org     A       D
    bio     A       B
    0       C
    

    【讨论】:

    • 如果您能提供帮助,我将不胜感激
    • @Ibk 更新的答案,应该给你你需要的 95%
    • 谢谢@MrMattBusby。我收到此错误文件“./transpose_column.py”,第 18 行 ofile.writelines(f'{key} ' + ' '.join(val) + ' ') ^
    • 对不起,没有足够的信息没有痕迹。尝试一些调试,比如只写一个空白字符串?也许您使用的是比我更旧的 Python (3.9) 并且不能使用该字符串格式 f'...'。或者,不用写信到外地,只需print(pros) 来检查一切是否正常。如果您可以接受我的回答,尽管我试图抓住几点以启用更多 SO 功能;)
    • 我使用最近的 Python 并让它运行,但它没有提供所需的输出。请注意,第二列(Biological_Process)下的所有条目都将由分号分隔或分开,因此您可以获得列中不同 Biological_Processes 的唯一列表,这将形成我们的新列 1,具有此类 Biological_Process 的基因将是列在每个 Biological_Process 的前面。您可以使用我提供的输入文件来测试脚本。谢谢
    【解决方案2】:
    $ cat script.awk 
    #! /usr/bin/awk -f 
    
    BEGIN {
        FS = "[	;]";  # sep can be a regex
        OFS = "	"
    }
    
    NR>1 && /^[A-Z]/{  # skip header & blank lines 
        for(i=NF; i>1; i--)
            if($i)   # skip empty bio-proc
               a[$i] = a[$i] OFS $1 
    }
    END{
        print "Biological_Process","Gene(s)"
        for(x in a)
            print x a[x] 
    }
    
    $ ./script.awk input.dat 
    Biological_Process  Gene(s)
    cell death  TOP1
    regulation of biological process    CHD4    TCOF1   TOP1    MTA2    MSH6
    transport   TCOF1
    cell division   TOP1
    metabolic process   BALF2   CHD4    TOP1    BALF5   MTA2    MSH6
    response to stimulus    TOP1    MSH6
    cell organization and biogenesis    CHD4    TCOF1   TOP1    MTA2    MSH6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 2021-08-03
      • 2017-11-17
      • 1970-01-01
      • 2018-01-07
      相关资源
      最近更新 更多