상대적 존재비 표를 만들려고 하는데 몇 가지 문제가 발생했습니다. 하나의 열을 성공적으로 완료했지만 전체 테이블을 변환하는 데 어려움을 겪고 있습니다.
- 테이블은 항상 .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
)가 필요한 부동 소수점을 사용하고 있기 때문입니다.