평균 행을 동일한 패턴으로 만들기

평균 행을 동일한 패턴으로 만들기

나는 거대한 테이블(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

관련 정보