このような6列のデータがあります
LINES XY1 XY2 XY3 XY4 XY5
P1 Z/Z T/T -/- T/T T/T
P2 A/A A/A G/G Z/Z T/T
1 G/G T/T G/G T/T G/G
2 T/T A/A C/C C/C T/T
3 T/T G/G T/T G/G T/T
4 A/A C/C A/A A/A A/A
5 A/A A/A T/T T/T A/A
行とでどの列 ( から
XY1
までXY5
) が異なるかを調べたいと思います。等しいとは、とが同じ文字 (対立遺伝子) を含むか、どちらかがまたはであることを意味します。P1
P2
P1
P2
Z/Z
-/-
1
行から列まで5
、P2
列全体から までの列XY1
を比較しますXY5
。出力に一致する場合は、otherwise を含める必要があり1
ます0
。これを続けて、私のプログラムは 2 番目の一連のP1
andP2
行に遭遇します。と の間で異なる列のみ
1
を含む行の行合計を計算します。5
P1
P2
と の間で異なる列の数で合計を割ることにより
1
、行の行の割合を計算します。5
P1
P2
私はこのような出力を期待しています
LINES XY1 XY2 XY3 XY4 XY5
P1 eq nq eq eq eq SUM %
P2 1
1 0 0 1 0 0 0 0
2 0 1 0 0 1 1 100
3 0 0 0 0 1 0 0
4 1 0 0 0 0 0 0
5 1 1 0 0 0 1 100
5,000 行を超えるデータがあり、現在、さまざまな数式を使用して Excel 2010 で作業していますが、多くのエネルギーを消費しています。
私はこの Perl をやりたいのですが、私は Perl の初心者です。ファイルを画面に読み込むことに成功しました。
ファイル読み込み部分まで書いたコードがこちら。
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV;
my $file = 'csv.csv';
my $csv = Text::CSV->new();
open(CSV, "<", $file) or die $!;
while (<CSV>) {
if ($csv->parse($_)) {
my @columns = $csv->fields();
print "@columns\n";
}
else {
my $err = $csv->error_input;
print "Failed to parse line: $err";
}
}
close CSV;