Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 递归地子集一个data.frame_Python_R_Dataframe - Fatal编程技术网

Python 递归地子集一个data.frame

Python 递归地子集一个data.frame,python,r,dataframe,Python,R,Dataframe,我有一个数据框,里面有将近400万行。我需要一种基于两个标准对数据进行子集划分的有效方法。我可以这样做,这是一个for循环,但我想知道是否有一个更优雅的方式来做到这一点,显然更有效。data.frame如下所示: SNP CHR BP P rs1000000 chr1 126890980 0.000007 rs10000010 chr4 21618674 0.262098 rs10000012 chr4 135

我有一个数据框,里面有将近400万行。我需要一种基于两个标准对数据进行子集划分的有效方法。我可以这样做,这是一个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    
我需要做的第一件事是选择那些
SNP
值低于阈值的
p
,然后按
CHR
POS
对该子集进行排序。这是简单的部分,使用
子集
顺序
。然而,下一步是棘手的一步。一旦我有了这个子集,我需要从重要的
SNP
上下取下一个500000窗口中的所有
SNP
,这个步骤将定义一个区域。我需要对所有重要的
SNP
进行分析,并将每个区域存储到一个列表或类似的东西中,以进行进一步的分析。例如,在显示的数据框中,
CHR==chr1
的最显著
SNP
(即低于阈值0.001)为
rs1000000
,而
CHR==chr4
rs1000092
。因此,这两个
SNP
将定义两个区域,我需要从每个最重要的
SNP
POS
上下取50万个区域的SNP


我知道这有点复杂,现在,我正在用手做棘手的部分,但这需要很长时间。任何帮助都将不胜感激。

这里有一个使用
data.table的部分解决方案,这可能是处理大型数据集时使用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
将输出保存在不同的文件中
请注意,此答案使用的是
fwrite
,它仍在
data.table
的开发版本中。您可以简单地使用
write.csv
,但是您要处理的数据集很大,因此速度非常重要,
fwrite
当然非常重要

这里是一个使用
data.table
的ir R部分解决方案,这可能是处理大型数据集时使用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
将输出保存在不同的文件中

请注意,此答案使用的是
fwrite
,它仍在
data.table
的开发版本中。您可以简单地使用
write.csv
,但是您要处理的数据集很大,因此速度非常重要,
fwrite
当然非常重要

你是在试图实现一个通用的算法吗?如果没有的话,还有一些库可以使这些类型的操作变得相当简单(和快速),比如Pandas。我知道熊猫的事,但我的知识还没有写剧本那么渊博,你能帮忙吗?我很乐意帮忙,但一般来说,我们确实写了那么多代码。如果你向我展示for-loop版本,那么我就可以向你展示如何在Pandas中实现它。谢谢,我会尽我最大的努力,并尝试发布我到目前为止的成果。你是在尝试实现一个通用的算法吗?如果没有的话,还有一些库可以使这些类型的操作变得相当简单(和快速),比如Pandas。我知道熊猫的事,但我的知识还没有写剧本那么渊博,你能帮忙吗?我很乐意帮忙,但一般来说,我们确实写了那么多代码。如果你向我展示for-loop版本,那么我就可以向你展示如何在Pandas中实现它。谢谢,我会尽我最大的努力,并尝试发布我从哪里得到这么多farThank you@eddi。听起来不错。请随意编辑我的答案。谢谢各位,它成功了,@eddi有没有办法分割不同的区域或将列
BP
,和
P
添加到您的输出?@user2380782一个选项是提取索引,然后从原始
数据中提取子集。表
-
df[df,{idx=…;.I[…]),by=CHR]$V1]
谢谢@eddi和rafael的帮助当然,这里有一个选项:
fwrite(copy(.SD)[,SNP:=SNP],…
谢谢@eddi。听起来不错。请随意编辑我的答案。谢谢大家,它做到了,@eddi有办法分割不同的区域或将列
BP
P
添加到输出中吗?@user2380782一个选项是从原始
数据中提取索引,然后再提取子集。表
-
df[df,{idx=…;.I[…]},by=CHR]$V1]
感谢@eddi和rafael的帮助当然,这里有一个选项:
fwrite(copy(.SD)[,SNP:=SNP],…
df[, {idx = (1:.N)[which.min(P)]
      SNP[seq(max(1, idx - 5e5), min(.N, idx + 5e5))]}, by = CHR]
df[, fwrite(copy(.SD)[, SNP := SNP], paste0("output", SNP,".csv")), by = SNP]