
私は巨大なテーブル(10列と6000行)を持っており、列3(ja)に同じパターンがある場合にのみ、すべての行の平均を計算する必要があります。私のテーブルには数字と文字列が含まれています。
例は次のとおりです。
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