我有一个如下所示的文件:
latitude Chr01 0.85
latitude Chr05 0.25
latitude Chr11 0.07
latitude Chr13_a 0.26
latitude Chr13_b 0.00
latitude Chr14_a 0.00
latitude Chr14_b 1
latitude Chr15 1
latitude Chr16_a 0.01
latitude Chr16_b 1
latitude Chr17 0.62
MCMT Chr01 1
MCMT Chr05 0.30
MCMT Chr11 0.018
MCMT Chr13_a 0.34
MCMT Chr13_b 0.00
MCMT Chr14_a 0.00
MCMT Chr14_b 1
MCMT Chr15 1
MCMT Chr16_a 0.00
MCMT Chr16_b 1
MCMT Chr17 0.18
tD Chr01 0.09
tD Chr05 0.00
tD Chr11 0.02
tD Chr13_a 0.04
tD Chr13_b 2.88
tD Chr14_a 5.25
tD Chr14_b 1
tD Chr15 1
tD Chr16_a 0.00
tD Chr16_b 1
tD Chr17 0.00
我想将我的文件转换成这种格式
env chr01 chr05 chr11 chr13_a chr13_b chr14_a chr14_b chr15 chr16_a chr16_b chr17
latitude 0.85 0.25 0.07 0.26 0 0 1 1 0.01 1 0.62
MCMT 1 0.3 0 0.34 0 0 1 1 0 1 0.18
TD 0.09 0 0.02 0.04 2.88 5.25 1 1 0 1 0
我怎样才能做到这一点?
答案1
可能有专门用于此目的的生物信息学工具 - 但除此之外您可以使用GNU 数据混合
$ datamash -s crosstab 1,2 unique 3 < file
Chr01 Chr05 Chr11 Chr13_a Chr13_b Chr14_a Chr14_b Chr15 Chr16_a Chr16_b Chr17
MCMT 1 0.30 0.018 0.34 0.00 0.00 1 1 0.00 1 0.18
latitude 0.85 0.25 0.07 0.26 0.00 0.00 1 1 0.01 1 0.62
tD 0.09 0.00 0.02 0.04 2.88 5.25 1 1 0.00 1 0.00
如果输出行的顺序很重要,请将结果通过管道传输sort
顺便说一句,这并不是真正的转置 - 它是交叉表(有时称为数据透视表)。
答案2
与米勒 (http://johnkerl.org/miller/doc)
mlr --inidx --ifs " " --opprint rename 1,env,2,key,3,value then reshape -s key,value input.txt
给你
env Chr01 Chr05 Chr11 Chr13_a Chr13_b Chr14_a Chr14_b Chr15 Chr16_a Chr16_b Chr17
latitude 0.85 0.25 0.07 0.26 0.00 0.00 1 1 0.01 1 0.62
MCMT 1 0.30 0.018 0.34 0.00 0.00 1 1 0.00 1 0.18
tD 0.09 0.00 0.02 0.04 2.88 5.25 1 1 0.00 1 0.00