1

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

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

谁能帮我这个?

4

2 回答 2

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
于 2013-09-30T12:50:29.183 回答
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 解决了这个问题。

于 2013-09-30T12:49:09.497 回答