【问题标题】:Filter significant hits out of big dataset with row and column name使用行和列名称从大数据集中过滤掉重要的命中
【发布时间】:2013-09-30 21:12:38
【问题描述】:

我有几个像这样的大文件;

IID     geneA           geneA1          geneA2          geneA3          geneA4
snp24   0.9999998116    0.9999998116    0.9999998116    0.9999998116    0.9999998116
snp25   0.9999998116    0.9999998116    0.9999998116    0.9999998116    0.9999998116
snp26   0.9999998116    0.9999998116    0.9999998116    0.9999998116    0.9999998116
snp27   0.9999998116    0.9999998116    0.9999998116    0.9999998116    0.9999998116
snp28   0.9999998116    0.9999998116    0.9999998116    0.9999998116    0.9999998116
snp29   0.9999998116    0.9999998116    2.0107465936227367e-11  0.0009575306    0.9999998116
snp30   0.9999998116    0.9999998116    4.033923217176159e-11   0.04319423  0.9999998116
snp31   0.9999998116    0.9999998116    7.983277836657833e-11   0.0933816338    0.9999998116
snp32   0.9999998116    0.9999998116    0.0018850954    0.4196570142    0.9999998116
snp33   0.9999998116    0.9999998116    0.6007038997    0.9999998116    0.9999998116
snp34   0.9999998116    0.9999998116    0.9999998116    0.9999998116    0.9999998116

我需要过滤掉那些非常重要的。现在一开始我教过grep "e-" 这很容易,但后来我得到了整行。

我想从这些文件中得到的是这样的(所有非常重要的命中):

snp29  geneA2   2.0107465936227367e-11
snp30  geneA2   2.0107465936227367e-11

谁能帮我解决这个问题?

【问题讨论】:

  • 您如何定义“所有非常重要的点击”?最小/最大...?
  • 一切低于 e-8
  • @FlorisBrenk,您可能会发现 MatrixEQTL 包对您的分析很有用。

标签: r unix grep filtering


【解决方案1】:

以下方法可以完成这项工作(dat 是您的数据框的名称):

sig <- 1e-8  # the threshold

idx <- which(dat[-1] < sig, arr.ind = TRUE)

res <- data.frame(ID = dat[idx[, "row"], 1],
                  gene = names(dat)[-1][idx[, "col"]],
                  sig = dat[-1][idx])

结果:

     ID   gene          sig
1 snp29 geneA2 2.010747e-11
2 snp30 geneA2 4.033923e-11
3 snp31 geneA2 7.983278e-11

【讨论】:

    【解决方案2】:

    如果你想使用 R,这里有一个简单的解决方案。首先,您可以像这样使用 grep 过滤数据集:

    grep e datafile > filtered.out
    

    这将选择具有重要数据的行,因此您无需将其全部读入 R 以及标题(包含“e”)。然后在 R 中你可以运行这个:

    data <- read.table("filtered.out",T,row.names=1)
    sig <- data< 1e-8
    sigvalues <- data.frame(IID=rownames(data)[row(data)[sig]],gene=colnames(data)[col(data[sig]],value=data[sig])
    

    这是输出:

        IID   gene        value
    1 snp29 geneA2 2.010747e-11
    2 snp30 geneA2 4.033923e-11
    3 snp31 geneA2 7.983278e-11
    

    可能还有一种全 unix 的方法来做到这一点,但我没有足够的 unix 专家来临时想出它。但我看到 fedorqui 已经使用 awk 解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2018-06-20
      相关资源
      最近更新 更多