2015-07-22 3 views
2

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

chr1,700244,714068,LOC100288069,982 
chr1,1568158,1570027,MMP23A,784 
chr1,1567559,1570030,MMP23A,784 
chr1,1849028,1850740,TMEM52,799 
chr1,2281852,2284100,LOC100129534,934 
chr1,2281852,2284100,LOC100129534,800 
chr1,2460183,2461684,HES5,819 
chr1,2460183,2461684,HES5,850 
chr1,2517898,2522908,FAM213B,834 
chr1,2518188,2522908,FAM213B,834 
chr1,2518188,2522908,FAM213B,834 
chr1,2518188,2522908,FAM213B,834 
chr1,2517898,2522908,FAM213B,834 

, если столбец 3 повторов в строке, суммировать значение colum 4 и вывести среднее значение такой суммы. Выходной сигнал должен быть:

chr1,700244,714068,LOC100288069,982 
chr1,1568158,1570027,MMP23A,784 
chr1,1849028,1850740,TMEM52,799 
chr1,2281852,2284100,LOC100129534,934 
chr1,2460183,2461684,HES5,834.5 
chr1,2517898,2522908,FAM213B,867 

Я пробовал этот сценарий, но не работал. Может ли кто-нибудь дать мне подсказку?

f1 = open('path', 'r') 

reader1 = f1.read() 

f3 = open('path/B_Media.txt','wb') 

for line1 in f1: 

    coluna = line1.split(',') 
    chr = coluna[0] 
    start = coluna[1] 
    end = coluna[2] 
    gene = coluna[3] 
    valor_B = coluna[4] 
    previous_line = current_line 
    current_line = line 
    gene2 = previous_line[3] 
    soma_B2 = previous_line[4] 
    soma_de_B = int(valor_B)+int(soma_B2) 
    if gene == gene2: 
      x += 1 
      media_gene = soma_de_B/x 
      output = chr + "," + start + "," + end + "," + gene + "," +valor_B+","+media_gene 
      f3.write(output) 
      f3.flush() 
      print output 

ответ

1

Как вы должны знать, что будет дальше (выступая в пути чтения построчно), я бы разделить чтение и запись на две разные части.

Кроме того, может возникнуть необходимость в модуле csv, так как вам не нужно иметь дело с какими-либо особыми случаями (например, запятыми в тексте и т. Д.), А чтение/запись очень просто. Как правило, хорошей практикой является открытие файлов с помощью with, так как закрытие автоматически обрабатывается.

Теперь для некоторого кода :-)

from __future__ import division 
import csv 

gene = 3 
valor_B = 4 

data = [] 
with open('data.csv', 'r') as readfile: 
    reader = csv.reader(readfile) 
    for row in reader: 
     data.append(row) 

values_to_add = [] 
with open('B_Media.txt','wb') as writefile: 
    writer = csv.writer(writefile) 

    for i in range(len(data)): 
     values_to_add.append(int(data[i][valor_B])) 
     # if last row or row is different from previous, write it 
     if i == len(data)-1 or data[i][gene] != data[i+1][gene]: 
      data[i][valor_B] = sum(values_to_add)/len(values_to_add) 
      writer.writerow(data[i]) 
      values_to_add = [] 

В основном это первый читает все из входного файла и помещает его в data. Затем with выходной файл, он проходит через каждую строку, выполнив следующие действия:

  • Добавить значение из колонки 4, который мы в конечном итоге писать (mabye сейчас не в этом проходе, но в конце концов), к списку значений для записи
  • Если мы пришли к строке, которая отличается от предыдущей или последней строкой (нам тоже нужно ее поймать!), напишите на вывод. Если мы это сделаем, мы возьмем среднее значение нашего списка значений, которые мы собрали до сих пор (по крайней мере 1, может быть, 2 или более). Мы вычисляем среднее значение с помощью sum()/len() и заменяем соответствующий столбец нашим новым значением, а затем записываем его в выходной файл.
  • Если это не так, ничего не делайте! Значение из столбца 4 уже добавлено в список на первом шаге, поэтому мы можем просто перейти на один шаг вперед к следующей строке.

Результат:

chr1,700244,714068,LOC100288069,982.0 
chr1,1567559,1570030,MMP23A,784.0 
chr1,1849028,1850740,TMEM52,799.0 
chr1,2281852,2284100,LOC100129534,867.0 
chr1,2460183,2461684,HES5,834.5 
chr1,2517898,2522908,FAM213B,834.0 

(Вы могли бы признать from __future__ import division заявление, что делает, что мы можем иметь не целые значения при делении, как 834.5.)

+0

Спасибо так много! Это отлично работает =) Командная строка полностью отличается от ранее hhahhahahahaaha С уважением, – Jontexas

+0

@Jontexas Добро пожаловать! Рассмотрите возможность установки принятого ответа, если это вам помогло :) – adrianus

+0

Done @adrianus :) Это очень помогло! = D – Jontexas

Смежные вопросы