如何获取仅提取唯一名称的行

时间:2014-07-09 19:31:52

标签: r perl awk

我有一组看起来像这样的数据

Gene    U2803   U2823   U2840   U2841   U2862   U2872   U2897   U2982   U2991   U2994   U2998   U2999   U3001   U3007   U3012   U2980
A1BG-AS 7.3159  9.3802  10.77   8.701   13.6066 8.3253  9.0556  9.8801  9.0776  11.2029 7.61    10.8403 9.2378  12.1697 9.7482  5.5327
A1BG    7.4715  5.2955  10.2275 6.3606  10.1463 5.9968  6.2673  8.6119  6.153   6.7903  4.0843  13.0875 6.8167  8.3186  6.7643  5.14
A1CF    0   0   0   0   0.0026  0   0   0   0   0   0   0   0   0   0.0037  0
A2LD1   1.776   1.125   1.3508  1.2489  2.1252  2.1057  1.0177  1.6063  1.0053  0.9571  1.4972  1.3998  1.0935  2.4737  1.2063  1.7788
A2ML1   0.1024  0.092   0.0473  0.071   0.1227  0.2047  0.2481  0.1089  0.0499  0.1381  0.057   0.0953  0.0433  0.0651  0.0598  0.0434
A2M 5.4296  0.1688  2.4767  0.2507  0.5087  4.2835  2.2989  8.6027  3.1126  0.4565  0.167   2.9066  3.195   0.942   5.8904  6.7635
A4GALT  0.2918  11.5673 4.9554  0   1.6693  1.6301  0.4985  2.4444  0.6217  1.4638  3.2648  0.5773  3.1071  7.651   0.4068  5.133
A4GANLT 0   0   0   0   0.0575  0.1018  0   0.0422  0   0   0   0.0257  0.0276  0   0   0.0288
AAA1    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
AAA1    18.789  24.8681 29.8037 33.3986 37.8269 24.4719 21.1101 26.9985 21.9897 25.3416 26.77   23.1337 20.5193 27.0328 23.9777 29.5313

正如您注意到AAA1和A4GALt在此数据集中出现两次,这不是我想要遵循的计算类型的理想场景。

如何通过消除具有相同名称的行来消除这种冗余,可能的方法是什么,哪个是最好的?一种方法是保持具有最高均值或最大方差的行。

使用awk或perl或R执行此操作的小示例将非常有用。

谢谢

4 个答案:

答案 0 :(得分:2)

perl -ane '$s{$F[0]}++ or print' file

留下具有更大差异的重复项,

perl -MList::Util=sum -lane'
  $k = shift @F;
  $v = sum(@F)/@F;
  $s{$k} or push @r, $k;
  @{$s{$k}}{"l", "v"} = ($_, $v) if $v >$s{$k}{v};
 }{
  print $s{$_}{l} for @r;
' file

答案 1 :(得分:2)

在R

data[!duplicated(data$Gene), ]

假设有一个名为Gene的列。

R中不允许使用重复的行名,因此Gene可能位于第一列。

答案 2 :(得分:1)

删除具有相同第一个字段的所有行,除了第一个字段:

awk '(a[$1]++ == 0){print $0}' file

答案 3 :(得分:1)

awk解决方案可能就像你只保留第一次发生一样:

awk '!a[$1]++' infile