【问题标题】:R Data Frame Filter Not WorkingR数据帧过滤器不工作
【发布时间】:2017-10-22 13:41:02
【问题描述】:

我正在尝试过滤 RNA-seq 数据分析的输出。我想在至少一个实验条件(数据框)中生成符合指定标准的基因列表。

比如数据输出为.csv,所以我在整个目录中读取,如下。

readList = list.files("~/Path/To/File/", pattern = "*.csv")
files = lapply(readList, read.csv, row.names = 1)   
#row.names = 1 sets rownames as gene names

这会读入 3 个 .csv 文件,A、B 和 C。数据如下所示

A = files[[1]]
B = files[[2]]
C = files[[3]]
head(A)
            logFC    logCPM       LR            PValue           FDR
YER037W -1.943616  6.294092 34.30835 0.000000004703583 0.00002276064
YJL184W -1.771273  5.840774 31.97088 0.000000015650144 0.00003786552
YFR053C  1.990102 10.107793 30.55576 0.000000032440747 0.00005232692
YDR342C  2.096877  6.534761 28.08635 0.000000116021451 0.00014035695
YGL062W  1.649138  8.940714 23.32097 0.000001370968319 0.00132682314
YFR044C  1.992810  9.302504 22.91553 0.000001692786468 0.00132736130

然后我尝试过滤所有这些以生成一个基因列表(行名),其中必须在至少一个数据集中满足两个条件。

1.logFC > 1 或

2.FDR

所以我像这样遍历数据帧

genesKeep = ""
for (i in 1:length(files) {
F = data.frame(files[i])
sigGenes = rownames(F[F$FDR<0.05 & abs(F$logFC>1), ])
genesKeep = append(genesKeep, values = sigGenes)

}

这给了我一个基因列表,但是,当我根据数据对这些基因进行健全检查时,列出的一些基因没有通过这些阈值,而其他通过这些阈值的基因不在列表中。

例如

df = cbind(A,B,C)
genesKeep = unique(genesKeep)
logicTest = rownames(df) %in% genesKeep
dfLogic = cbind(df, logicTest)

虽然大多数基因确实通过了我设定的标准,但我发现少数基因存在一些差异。例如

          A.logFC    A.FDR     B.logFC    B.FDR     C.logFC    C.FDR   logicTest
YGR181W -0.8050325 0.1462688 -0.6834184 0.2162317 -1.1923744 0.04049870 FALSE
YOR185C  0.8321432 0.1462919  0.7401477 0.2191413 -0.9616989 0.04098177 TRUE

第一个基因(YGR181W)通过条件 C 的标准,其中 logFC

相反,第二个基因(YOR185C)在任何情况下都不通过这些标准,但该基因存在于genesKeep列表中。

我不确定我在哪里出错了,但如果有人有任何想法,他们将不胜感激。

谢谢。

【问题讨论】:

  • 您可能想尝试按行名称排序,或者合并而不是cbinding,因为数据集之间的并行行名称可能存在问题
  • @akash87 你是对的!这么简单的事情让我整天都在坚持。非常感谢您的建议!

标签: r dataframe


【解决方案1】:

我不确定您想要的输出是什么,但如果您的数据格式是一致的,则可以稍微简化一下并使用dplyr 库一次过滤所有输出。以您数据的一些修改版本为例:

A <- structure(list(gene = structure(c(2L, 6L, 4L, 1L, 5L, 3L), .Label = c("YDR342C", 
"YER037W", "YFR044C", "YFR053C", "YGL062W", "YJL184W"), class = "factor"), 
    logFC = c(-1.943616, -1.771273, 0, 2.096877, 1.649138, 1.99281
    ), logCPM = c(6.294092, 5.840774, 10.107793, 6.534761, 8.940714, 
    9.302504), LR = c(34.30835, 31.97088, 30.55576, 28.08635, 
    23.32097, 22.91553), PValue = c(4.703583e-09, 1.5650144e-08, 
    3.2440747e-08, 1.16021451e-07, 1.370968319e-06, 1.692786468e-06
    ), FDR = c(2.276064e-05, 3.786552e-05, 5.232692e-05, 0.00014035695, 
    0.00132682314, 0.06)), .Names = c("gene", "logFC", "logCPM", 
"LR", "PValue", "FDR"), class = "data.frame", row.names = c(NA, 
-6L))

B <- structure(list(gene = structure(c(2L, 6L, 4L, 1L, 5L, 3L), .Label = c("YDR342C", 
"YER037W", "YFR044C", "YFR053C", "YGL062W", "YJL184W"), class = "factor"), 
    logFC = c(-0.4, -0.3, 0, 2.096877, 1.649138, 1.99281), logCPM = c(6.294092, 
    5.840774, 10.107793, 6.534761, 8.940714, 9.302504), LR = c(34.30835, 
    31.97088, 30.55576, 28.08635, 23.32097, 22.91553), PValue = c(4.703583e-09, 
    1.5650144e-08, 3.2440747e-08, 1.16021451e-07, 1.370968319e-06, 
    1.692786468e-06), FDR = c(2.276064e-05, 3.786552e-05, 5.232692e-05, 
    0.00014035695, 0.1, 0.06)), .Names = c("gene", "logFC", "logCPM", 
"LR", "PValue", "FDR"), class = "data.frame", row.names = c(NA, 
-6L))

使用rbind 创建一个单独的数据框来处理:

AB<- rbind(A,B)

然后根据您的标准过滤整个事情。请注意,可能会出现重复,因此您可以使用 distinct 仅返回符合条件的唯一基因:

filter(AB, logFC < -1 | logFC > 1, FDR < 0.05) %>%
  distinct(gene)

     gene
1 YER037W
2 YJL184W
3 YDR342C
4 YGL062W

或者,保留这些基因的所有行:

filter(AB, logFC < -1 | logFC > 1, FDR < 0.05) %>%
  distinct(gene, .keep_all = TRUE)

     gene     logFC   logCPM       LR       PValue          FDR
1 YER037W -1.943616 6.294092 34.30835 4.703583e-09 2.276064e-05
2 YJL184W -1.771273 5.840774 31.97088 1.565014e-08 3.786552e-05
3 YDR342C  2.096877 6.534761 28.08635 1.160215e-07 1.403570e-04
4 YGL062W  1.649138 8.940714 23.32097 1.370968e-06 1.326823e-03

【讨论】:

  • 感谢您的建议。我已经使用 akash87 提出的建议让它工作了。但是,我总是有兴趣尝试更好地理解 R,所以我也会试一试你的方法。我会告诉你进展如何。
  • 哦,对了,我现在明白了。很高兴你解决了!
【解决方案2】:

按照 akash87 的建议使用 merge 解决了这个问题。

原来cbind 导致行名分配不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 2021-12-28
    相关资源
    最近更新 更多