我有一组看起来像这样的数据
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执行此操作的小示例将非常有用。
谢谢
答案 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