나는 거대한 테이블(10개 열과 6000개 행)을 가지고 있으며 열 3(ko)에 동일한 패턴이 있는 경우에만 모든 행의 평균을 계산해야 합니다. 내 테이블에는 숫자와 문자열이 포함되어 있습니다.
예는 다음과 같습니다.
pvalue padj ko pathway
17,14 0,01 ko00620 Pyruvatemetabolism
15,76 0,01 ko00620 Pyruvatemetabolism
13,22 0,00 ko00620 Pyruvatemetabolism
12,40 0,00 ko00051 Fructoseandmannosemetabolism
12,03 0,01 ko00051 Fructoseandmannosemetabolism
나는 이런 것을 얻고 싶다
pvalue padj ko pathway
15,38 0,01 ko00620 Pyruvatemetabolism
12,22 0,00 ko00051 Fructoseandmannosemetabolism
답변1
아마도 당신이 찾고 있는 대답은 아니지만 어쨌든 흥미로울 것입니다.
#!/usr/bin/env perl
use strict;
use warnings;
use DBI;
my $dbh = DBI->connect(
'dbi:CSV:',
undef, undef, {
f_ext => '.csv/r',
csv_sep_char => "\t",
csv_quote_char => undef,
csv_escape_char => undef,
}
);
my $sth = $dbh->prepare(
'SELECT AVG(pvalue), AVG(padj), ko, pathway
FROM data GROUP BY ko, pathway'
);
$sth->execute();
while ( my $row = $sth->fetchrow_arrayref ) {
printf "%.2f\t%.2f\t%s\t%s\n", @$row;
}
$dbh->disconnect;
위의 내용은 데이터가 탭으로 구분된 CSV 파일에 있다고 가정합니다 data.csv
.
답변2
어쩌면 GNU가 datamash
당신을 위한 것일 수도 있습니다:
$ datamash -H -g3,4 mean 1 mean 2 < file
GroupBy(ko) GroupBy(pathway) mean(pvalue) mean(padj)
ko00620 Pyruvatemetabolism 15,373333333333 0,0066666666666667
ko00051 Fructoseandmannosemetabolism 12,215 0,005
답변3
awk를 사용하세요
awk '
NR == 1 {print;next}
{
n[$3]++
val[$3] += $1
adj[$3] += $2
path[$3] = $4
}
END {
for (ko in n)
printf "%.2f %.2f %s %s\n", val[ko]/n[ko], adj[ko]/n[ko], ko, path[ko]
}
' file | column -t