根据2,3,4列中的值总和获取唯一行

时间:2013-05-07 21:49:40

标签: python awk

我在R中为我的分析制作一本字典,这本字典需要有独特的标签。

我的数据看起来像这样

Labels  t1  t2  t3
gene1   0.000000E+00    0.000000E+00    1.138501E-01
gene2   0.000000E+00    0.000000E+00    9.550272E-02
gene3   0.000000E+00    1.851936E-02    1.019907E-01
gene4   8.212816E-02    0.000000E+00    6.570984E+00
gene5   1.282434E-01    0.000000E+00    6.240799E+00
gene6   2.918929E-01    8.453281E-01    3.387610E+00
gene7   0.000000E+00    1.923038E-01    0.000000E+00
gene7   0.000000E+00    00000000E+00    0.000000E+00
gene8   1.135057E+00    0.000000E+00    2.491100E+00
gene9   7.935625E-01    1.070320E-01    2.439292E+00
gene10  5.046790E+00    0.000000E+00    2.459273E+00
gene11  3.293614E-01    0.000000E+00    2.380152E+00
gene11  3.293614E-01    0.000000E+00    2.380152E+00
gene12  0.000000E+00    0.000000E+00    1.474757E-01
gene13  0.000000E+00    0.000000E+00    1.521591E-01
gene14  0.000000E+00    9.968809E-02    8.387166E-01
gene15  0.000000E+00    1.065761E-01    0.000000E+00

这里表格标签gene7出现两次,在这种情况下,必须添加所有列中的值,并且应该选择具有最高值的值,并且应该丢弃另一个值。如果是基因11的情况下应该选择第一个,应该选择其中一个而丢弃其他的。

我尝试过排序-u k2V,2和许多组合,但失败了。

awk / python中的任何一个衬垫

请帮助

谢谢

2 个答案:

答案 0 :(得分:2)

使用my.data <- cbind(my.data, sum=sum(my.data[,c(2:4)])然后my.data <- my.data[order(my.data$sum),]为列2,3,4的总和添加一列,最后,使用as.vector(table(my.data))仅保留最高编号的值。不需要awk或python也不需要任何其他工具。内置R可以很好地完成工作。

答案 1 :(得分:2)

这一行:

awk 'NR>1{s=$2+$3+$4;if(($1 in a && s>m[$1])|| !($1 in a)){m[$1]=s;a[$1]=$0}}END{for(x in a)print a[x]}' file|sort -V

输出:

gene1   0.000000E+00    0.000000E+00    1.138501E-01
gene2   0.000000E+00    0.000000E+00    9.550272E-02
gene3   0.000000E+00    1.851936E-02    1.019907E-01
gene4   8.212816E-02    0.000000E+00    6.570984E+00
gene5   1.282434E-01    0.000000E+00    6.240799E+00
gene6   2.918929E-01    8.453281E-01    3.387610E+00
gene7   0.000000E+00    1.923038E-01    0.000000E+00
gene8   1.135057E+00    0.000000E+00    2.491100E+00
gene9   7.935625E-01    1.070320E-01    2.439292E+00
gene10  5.046790E+00    0.000000E+00    2.459273E+00
gene11  3.293614E-01    0.000000E+00    2.380152E+00
gene12  0.000000E+00    0.000000E+00    1.474757E-01
gene13  0.000000E+00    0.000000E+00    1.521591E-01
gene14  0.000000E+00    9.968809E-02    8.387166E-01
gene15  0.000000E+00    1.065761E-01    0.000000E+00

分解:

awk 'NR>1{s=$2+$3+$4;
    if(($1 in a && s>m[$1])|| !($1 in a)){m[$1]=s;a[$1]=$0}
}END{for(x in a)print a[x]}' file|sort -V