Создание матрицы присутствия / отсутствия (ось Y - это имена файлов, ось X - в файле) - PullRequest
0 голосов
/ 25 марта 2020

У меня есть несколько файлов (имен файлов) с несколькими последовательностями чтения (у каждого есть имя чтения, начинающееся с>) в них:

Имя файла1

>Readname1

>Readname2

Имя файла2

>Readname1

>Readname3

Учитывая словарь, который содержит все возможные имена для чтения, подобные этому:

g={}

g['Readname1']=[]

g['Readname2']=[]

g['Readname3']=[]

Как можно написать код, который будет повторять каждый файл и генерировать следующую матрицу:

          Filename1 Filename2

Readname1  1        1

Readname2  1        0

Readname3  0        1

Код следует сканировать содержимое каждого файла в каталоге. В идеале я мог бы читать словарь из входного файла, а не жестко закодировать, чтобы я мог генерировать матрицы для разных словарей. Содержание каждого чтения (например, его последовательность гена) не имеет значения, только то, присутствует ли имя чтения в этом файле или отсутствует.

Я только учусь python, поэтому коллега поделился своим кодом, чтобы заставить меня начал. Здесь они создавали матрицу присутствия / отсутствия своего словаря (Readnames) в одном указанном файле (files.txt). Я хотел бы ввести словарь из второго файла (чтобы он не был в коде * stati c) и перебрать несколько файлов.

from Bio import SeqIO
import os
dir_path="" #directory path
files=os.listdir(path=dir_path)
with open(dir_path+'files.txt') as f:
    files=f.readlines()
files=[x.strip() for x in files]
enter code here

g={}  
g['Readname1']=[]
g['Readname2']=[]
g['Readname3']=[]

for i in files:
    a = list(SeqIO.parse(dir_path + i, 'fasta')) 
    for j in a:
        g[j.id].append(i) 
print('generating counts...')
counts={} 
for i in g.keys():
   counts[i]=[] 

for i in files: 
    for j in g: 
        if i in g[j]: 
            counts[j].append(1)
        else:
            counts[j].append(0)

print('writing out...')
outfile=open(dir_path+'core_withLabels.csv','w') 
outfile2=open(dir_path+'core_noLabels.csv','w') 
temp_string=''
for i in files:
    outfile.write(','+i) 
    temp_string=temp_string+i+',' 
temp_string=temp_string[:-1] 
outfile2.write(temp_string+'\n')
outfile.write('\n')
for i in counts: 
    outfile.write(i) 
    temp_string=''
    for j in counts[i]: 
        outfile.write(','+str(j))
        temp_string=temp_string+str(j)+','
   temp_string=temp_string[:-1]
   outfile2.write(temp_string+'\n')
   outfile.write('\n')
outfile.close()
outfile2.close()

1 Ответ

1 голос
/ 25 марта 2020

Под матрицами вы подразумеваете матрицу numpy или Список [Список [int]]?

Если вам известно общее количество имен чтения, numpy матрица - это простая go. Для матрицы numpy создайте нулевую матрицу соответствующего размера. matrix = np.zeros((n_filenames, n_readnames), dtype=int) В качестве альтернативы, определите matrix = [[] for _ in range(n_filenames)]

Кроме того, определите карту, которая отображает имя чтения на idx в матрице

mapping = dict()
next_available_idx = 0

Затем выполните итерацию по всем файлам и заполните соответствующие записи с ними.

for i, filename in enumerate(filenames):
    with open(filename) as f:
        for readname in f:
            readname.strip() # get rid of extra spaces
            # find the corresponding column
            if readname in mapping:
                col_idx = mapping[readname]
            else:
                col_idx = next_available_idx
                next_available_idx += 1
                mapping[readname] = col_idx
            matrix[i, col_idx] = 1 # for numpy matrix
            """
            if you use list of lists, then:
            matrix[i] += [0] * (col_idx - len(matrix[i]) + [1]
            """

Наконец, если вы используете список списков, убедитесь, что длина всех списков одинакова. Вам нужно перебрать строки матрицы еще раз.

...