0

質問は「行平均の計算」に関するものです。以下のコードブロック。このコードはもともと 6 つのサンプルを念頭に置いて作成されたもので、n 個のサンプルにスケーリングしようとしています。

各 csv ファイルは個別の患者ファイルであり、以下のファイル内にあります。

| gene  | expression |
| ---   | ---        |
| A1BG  | 1.444      | 
| A1CF  | 4.303      |
| A2BP1 | 11.117     |

元のファイル リストは、コマンド ライン引数を受け入れてスケーリングできるように変更されていますが、次にどこに進むべきかわかりません。各サンプル名をプルして、そのコード ブロックで使用する必要があります。また、個別のリスト内包表記内でスライス表記を正しくインクリメントする必要もあります。何か案は?

import csv
import matplotlib.pyplot as plt
import sys

"""
This is an implementation of quantile normalization for microarray data analysis.
"""

# Parse csv files for samples, creating lists of gene names and expression values.
#file_list =  ['genes1.csv', 'genes2.csv', 'genes3.csv', 'genes4.csv', 'genes5.csv',
#                'genes6.csv']
while True:
    if (len(sys.argv) > 1):
        file_list = [args for args in sys.argv[1:]]
        print file_list
        break
    else:
        print "Not enough arguments given."
        break

set_dict = {}
for path in file_list:
    with open(path) as stream:
        data = list(csv.reader(stream, delimiter = '\t'))
    data = sorted([(i, float(j)) for i, j in data], key = lambda v: v[1])
    sample_genes = [i for i, j in data]
    sample_values = [j for i, j in data]
    set_dict[path] = (sample_genes, sample_values)

# Create sorted list of genes and values for all datasets.
set_list = [x for x in set_dict.items()]
set_list.sort(key = lambda (x,y): file_list.index(x))

これは、CLI でパラメーターとして指定された任意の数のサンプルを処理するためにスケーリングする必要があるコード ブロックです。

# Compute row means.
mean_values = [((a + b + c + d + e + f)/len(file_list)) 
                for i, (a, b, c, d, e, f) in 
                enumerate(zip([v for i, (j, k) in set_list[:1] for v in k], 
                [v for i, (j, k) in set_list[1:2] for v in k], 
                [v for i, (j, k) in set_list[2:3] for v in k], 
                [v for i, (j, k) in set_list[3:4] for v in k], 
                [v for i, (j, k) in set_list[4:5] for v in k], 
                [v for i, (j, k) in set_list[5:6] for v in k]))]

@ Bo102010によって以下に与えられた修正されたソリューション:

L = len(file_list)
all_sets = [set_list[i - 1: i] for i in range(1, L + 1)]
all_values = [[v for i, (j, k) in A for v in k] for A in all_sets]
mean_values = [sum(p) / L for p in zip(*all_values)]
4

1 に答える 1

1

あなたのコードブロックを正しく理解していれば、「スター表記」を使用してイテラブルを展開できるはずです。zipへの呼び出しでそれを使用します。

L = len(file_list)
all_sets = [set_list[i - 1: i] for i in range(1, L + 1)]
all_values = [[v for i, (j, k) in A for v in k] for A in all_sets]
mean_values = [sum(p) / L for p in zip(*all_values)]
于 2013-09-16T12:19:15.007 に答える