我有一个制表符分隔的文件,最后一列包含频率值(实际上这些值也是制表符分隔的)。我主要有两个值(例如,A:0 G:1),但有些行有三个值(例如,G:0 C:1 A:0)
CHROM POS N_ALLELES N_CHR {ALLELE:FREQ}
NC_037638.1 355689 2 2 A:0 G:1
NC_037638.1 355694 2 2 G:0.5 A:0.5
NC_037638.1 355703 2 2 C:0.5 G:0.5
NC_037638.1 355706 2 2 T:0.5 C:0.5
NC_037638.1 355715 2 2 A:0.5 G:0.5
NC_037638.1 355794 3 1 G:0 C:1 A:0
NC_037638.1 355723 2 2 A:0 G:1
NC_037638.1 355732 2 2 C:0.5 T:0.5
.
.
.
我想根据四个字母(A、C、G、T)中的哪个字母提取频率值作为每行的新列。我想要的输出是这样的:
CHROM POS N_ALLELES N_CHR A_FREQ G_FREQ C_FREQ T_FREQ
NC_037638.1 355689 2 2 0 1 NA NA
NC_037638.1 355694 2 2 0.5 0.5 NA NA
NC_037638.1 355703 2 2 NA 0.5 0.5 NA
NC_037638.1 355706 2 2 NA NA 0.5 0.5
NC_037638.1 355715 2 2 0.5 0.5 NA NA
NC_037638.1 355794 3 1 0 0 1 NA
NC_037638.1 355723 2 2 0 1 NA NA
NC_037638.1 355732 2 2 NA NA 0.5 0.5
.
.
.
如果我有列中的频率值,那么我可以轻松地在 R 或其他程序中绘图。需要“NA”,但可能只是缺失值,甚至是 0。我最关心的是如何删除冒号并将值放入列中。
另一种解决方案可能是,如果有人可以建议我如何在 R 或 Excel 中绘制每个 POS 处每个碱基(A、T、G、C)的频率,而不必担心将其转换为列。
我尝试了不同的解决方案,并努力进行绘图,但都徒劳无功。任何帮助/建议都将不胜感激,以便在 bash/R/Python 中执行此操作。提前非常感谢!
答案1
鉴于
$ cat file
CHROM POS N_ALLELES N_CHR {ALLELE:FREQ}
NC_037638.1 355689 2 2 A:0 G:1
NC_037638.1 355694 2 2 G:0.5 A:0.5
NC_037638.1 355703 2 2 C:0.5 G:0.5
NC_037638.1 355706 2 2 T:0.5 C:0.5
NC_037638.1 355715 2 2 A:0.5 G:0.5
NC_037638.1 355794 3 1 G:0 C:1 A:0
NC_037638.1 355723 2 2 A:0 G:1
NC_037638.1 355732 2 2 C:0.5 T:0.5
然后
$ awk '
BEGIN{
split("A:G:C:T",allele,/:/); OFS="\t"
}
NR==1 {
print $1,$2,$3,$4,"A_FREQ","G_FREQ","C_FREQ","T_FREQ"; next
}
{
for(i=5;i<=NF;i++){
split($i,a,/:/); freq[a[1]]=a[2]
}
}
{
for(i=1;i<=4;i++){
$(i+4) = allele[i] in freq ? freq[allele[i]] : "NA"
}
delete freq
}
1
' file
CHROM POS N_ALLELES N_CHR A_FREQ G_FREQ C_FREQ T_FREQ
NC_037638.1 355689 2 2 0 1 NA NA
NC_037638.1 355694 2 2 0.5 0.5 NA NA
NC_037638.1 355703 2 2 NA 0.5 0.5 NA
NC_037638.1 355706 2 2 NA NA 0.5 0.5
NC_037638.1 355715 2 2 0.5 0.5 NA NA
NC_037638.1 355794 3 1 0 0 1 NA
NC_037638.1 355723 2 2 0 1 NA NA
NC_037638.1 355732 2 2 NA NA 0.5 0.5