使用行和列名称过滤大数据集中的重要命中

时间:2013-09-30 12:31:58

标签: r unix grep filtering

我所拥有的是像这样的一些大文件;

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

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:3)

以下方法将完成工作(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

答案 1 :(得分:1)

如果你想使用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来解决它。