【发布时间】:2016-06-07 05:48:27
【问题描述】:
我之前曾发布过一个问题,需要使用R 来解决:subset recursively a data.frame,但是文件太大了,我需要大量时间和 RAM 内存才能读取它。我想知道我是否可以在 python 中使用pandas 来做同样的事情,因为我是 python 的新手,pandas 似乎更类似于 R,至少在它的 sintax 上。这是我上一篇文章的总结:
上一篇文章: 我有一个近 1500 万行的制表符分隔文件,其大小为 27GB。我需要一种有效的方法来根据两个标准对数据进行子集化。我可以这样做是一个 for 循环,但想知道是否有更优雅的方法可以做到这一点,而且显然更有效。 data.frame 如下所示:
SNP CHR BP P
rs1000000 chr1 126890980 0.000007
rs10000010 chr4 21618674 0.262098
rs10000012 chr4 1357325 0.344192
rs10000013 chr4 37225069 0.726325
rs10000017 chr4 84778125 0.204275
rs10000023 chr4 95733906 0.701778
rs10000029 chr4 138685624 0.260899
rs1000002 chr3 183635768 0.779574
rs10000030 chr4 103374154 0.964166
rs10000033 chr2 139599898 0.111846
rs10000036 chr4 139219262 0.564791
rs10000037 chr4 38924330 0.392908
rs10000038 chr4 189176035 0.971481
rs1000003 chr3 98342907 0.000004
rs10000041 chr3 165621955 0.573376
rs10000042 chr3 5237152 0.834206
rs10000056 chr4 189321617 0.268479
rs1000005 chr1 34433051 0.764046
rs10000062 chr4 5254744 0.238011
rs10000064 chr4 127809621 0.000044
rs10000068 chr2 36924287 0.000003
rs10000075 chr4 179488911 0.100225
rs10000076 chr4 183288360 0.962476
rs1000007 chr2 237752054 0.594928
rs10000081 chr1 17348363 0.517486
rs10000082 chr1 167310192 0.261577
rs10000088 chr1 182605350 0.649975
rs10000092 chr4 21895517 0.000005
rs10000100 chr4 19510493 0.296693
我需要做的第一件事是选择那些P值低于阈值的SNP,然后按CHR和BP对这个子集进行排序。一旦我有了这个子集,我需要从重要的 SNP 中获取上下 500,000 个窗口的所有 SNP,这一步将定义一个区域。我需要对所有重要的 SNP 执行此操作,并将每个区域存储到列表或类似的东西中以进行进一步分析。例如,在显示的数据框中,CHR==chr1 的最重要 SNP(即低于 0.001 的阈值)是 rs1000000,而 CHR==chr4 的最重要 SNP 是 rs10000092。因此,这两个 SNP 将定义两个区域,我需要在这些区域中的每一个中获取从每个最重要 SNP 的 POS 上下落入 500,000 区域的 SNP。
@eddi 和@rafaelpereira 提供的R 代码解决方案如下:
library(data.table) # v1.9.7 (devel version)
df <- fread("C:/folderpath/data.csv") # load your data
setDT(df) # convert your dataset into data.table
#1st step
# Filter data under threshold 0.05 and Sort by CHR, POS
df <- df[ P < 0.05, ][order(CHR, POS)]
#2nd step
df[, {idx = (1:.N)[which.min(P)]
SNP[seq(max(1, idx - 5e5), min(.N, idx + 5e5))]}, by = CHR]
【问题讨论】:
-
整个 DF 是否适合 RAM? 27 GB - 它是内存中的 DF 大小还是 CSV 文件大小?
POS是什么 - 还是您的示例 DF 中的BP? -
对不起@MaxU,我已经编辑了帖子以使其更清晰。该文件的大小为 27GB,它适合内存,但是当我拥有所有可用内存时(我在小型服务器上执行此操作)。因此,我试图找到一种更有效的方法,因为我有几个像这样的文件。
-
我猜你的 CSV 文件在
['SNP', 'CHR', 'BP', 'P']旁边有更多的列 - 这是正确的吗?我做了一个小测试——生成了非常相似的 DF,有 4 列和 20M 行——它占用了 534MB 的 RAM 和 861MB 作为 CSV 文件。在这种情况下,您绝对应该在阅读 DF 时使用usecols=['SNP', 'CHR', 'BP', 'P'],因此您不会阅读不需要的列 -
我已经更新了我的答案 - 请检查