【问题标题】:How to get rows with only unique names extracted [closed]如何获取仅提取唯一名称的行[关闭]
【发布时间】:2014-08-30 23:42:43
【问题描述】:

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

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 做这件事的小例子会很有帮助。

谢谢

【问题讨论】:

  • 您需要决定要删除哪些重复记录 - 只有在做出选择后,我们才能帮助您删除它们。要“保留具有最大方差的行”,您必须指定应计算方差的总体。你想计算第一个之后所有字段的方差吗?

标签: r perl awk


【解决方案1】:

在R中

data[!duplicated(data$Gene), ]

假设有一个名为Gene 的列。

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

【讨论】:

  • 谢谢,但如果我必须保持最大方差的行,那么呢?
【解决方案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

【讨论】:

  • @Angelo 检查更新。
【解决方案3】:

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

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

【讨论】:

  • 太棒了,它是根据均值丢弃行吗?
  • 是来自芯片的表达数据吗?如果是,您可能需要仔细分析数据,因为某些基因可能有多个探针。
  • 同意,但我该怎么办?我想摆脱这个重复的名字。你知道其他方法吗?
  • !=替换==,它会打印重复的行。如果您试图找出样本之间的差异,那么这种“重复”数据很有价值,您不能放弃它。一种可能的解决方案是重命名此类重复行中的基因,例如添加唯一的后缀(具体格式取决于您用于进一步分析的软件)。如果您不确定,请咨询您的 PI。
【解决方案4】:

一个 awk 解决方案可能就像只保留第一次出现一样简单:

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

【讨论】:

  • 如果我想保留方差最大的行怎么办?
  • 你是指其他字段的总数值吗?
  • 不完全是,方差是数据之间可变性的度量。
  • 通过比较第 2 列和第 16 列中的值。
猜你喜欢
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多