상대적 풍부도 표를 만드는 방법은 무엇입니까?

상대적 풍부도 표를 만드는 방법은 무엇입니까?

상대적 존재비 표를 만들려고 하는데 몇 가지 문제가 발생했습니다. 하나의 열을 성공적으로 완료했지만 전체 테이블을 변환하는 데 어려움을 겪고 있습니다.

  • 테이블은 항상 .tsv 형식이므로 탭으로 구분됩니다.
  • 1행에는 이름이 포함됩니다.
  • 2행부터 x행까지에는 데이터가 포함됩니다.
  • 열 1에는 행 이름이 포함됩니다.
  • 마지막 열(n)에는 분류가 포함되어 있으므로 숫자가 아닙니다.
  • 2열부터 (n-1)열까지는 상대 존재비(즉, 해당 열의 합으로 나눈 값)로 변환해야 하는 실제 수치 데이터가 포함되어 있습니다.

아래에 간단한 표가 나와 있습니다. 물론 범주형 필드는 일반적으로 훨씬 길지만 여기서는 짧게 했습니다.

#OTU ID SampleA SampleB SampleC Taxonomy
cddjfhj63vhjdsmr4j4ot   17  14  0   d__Bacteria; p__Proteobacteria;
FPLS01016108.2.1307 15  20  14  d__Bacteria; p__Proteobacteria;
JX225178.1.1277 0   0   0   d__Bacteria; p__Bacteroidota;
FJ439832.1.1432 12  0   0   d__Bacteria; p__Bacteroidota;

기본적으로 출력은 다음과 같아야 합니다.

#OTU ID SampleA SampleB SampleC Taxonomy
cddjfhj63vhjdsmr4j4ot   0.386363636 0.411764706 0   d__Bacteria; p__Proteobacteria;
FPLS01016108.2.1307 0.340909091 0.588235294 1   d__Bacteria; p__Proteobacteria;
JX225178.1.1277 0   0   0   d__Bacteria; p__Bacteroidota; c__Bacteroidia;
FJ439832.1.1432 0.272727273 0   0   d__Bacteria; p__Bacteroidota;

다음 코드를 찾았지만 하나의 열에 대해서만 작동하고 테이블에 이름이 있는 맨 위 행이 포함되어 있지 않은 경우:

awk 'FNR==NR{s+=$2;next;} {printf "%s\t%s\n",$1,$2/s}' table.tsv table.tsv > table2.tsv

몇 가지 "간단한" 명령을 사용하거나 Python을 사용하여 상대 존재비 테이블을 생성하는 방법을 사용하여 Linux에서 내 테이블을 처리할 수 있는 방법에 대해 알고 계시나요?

감사해요!

답변1

awk 'BEGIN{ FS=OFS="\t"; CONVFMT="%.9f" }
   NR==FNR{ for(i=2; i<=4; i++) sum[i]+=$i; next }
   FNR>1  { $2/=sum[2]; $3/=sum[3]; $4/=sum[4] }1' infile infile

일반적으로 시작/끝 열을 전달해야 합니다.

awk -v strt=2 -v end=4 '
BEGIN  { FS=OFS="\t"; CONVFMT="%.9f" }
NR==FNR{ for(i=strt; i<=end; i++) sum[i]+=$i; next }
FNR>1  { for(i=strt; i<=end; i++) $i/=sum[i] }1' infile infile

자세히 알아보기컨벌루션 FMT; 여기에는 유효 숫자 9자리 %.9f(기본값 %.6g)가 필요한 부동 소수점을 사용하고 있기 때문입니다.

관련 정보