Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
Sql 在R中选择表内行的快速方法?_Sql_R_Row_Data.table_Sqldf - Fatal编程技术网

Sql 在R中选择表内行的快速方法?

Sql 在R中选择表内行的快速方法?,sql,r,row,data.table,sqldf,Sql,R,Row,Data.table,Sqldf,我正在寻找一种从更大的表中提取大量行的快速方法。我的桌面如下: > head(dbsnp) snp gene distance rs5 rs5 KRIT1 1 rs6 rs6 CYP51A1 1 rs7 rs7 LOC401387 1 rs8 rs8 CDK6 1 rs9 rs9 CDK6 1 rs10 rs10 CDK6

我正在寻找一种从更大的表中提取大量行的快速方法。我的桌面如下:

> head(dbsnp)

      snp      gene distance
rs5   rs5     KRIT1        1
rs6   rs6   CYP51A1        1
rs7   rs7 LOC401387        1
rs8   rs8      CDK6        1
rs9   rs9      CDK6        1
rs10 rs10      CDK6        1
尺寸:

> dim(dbsnp)
[1] 11934948        3
我想选择列表中包含行名的行:

> head(features)
[1] "rs1367830" "rs5915027" "rs2060113" "rs1594503" "rs1116848" "rs1835693"

> length(features)
[1] 915635
毫不奇怪,这样做的简单方法花费了相当长的时间

我一直在研究通过R中的sqldf包实现这一点的方法。我认为这可能会更快。不幸的是,我不知道如何在SQL中选择具有特定行名的行


谢谢。

大多数人最初尝试的方式是:

dbsnp[ rownames(dbsnp) %in% features, ]  # which is probably slower than your code

因为您说这需要很长时间,所以我怀疑您已经超过了RAM容量,并且已经开始使用虚拟内存。您应该关闭系统,然后以R作为运行应用程序重新启动,看看是否可以避免“虚拟化”。

使用
sqldf
您需要
rownames=TRUE
,然后您可以使用
row\u names
查询行名:

library(sqldf)

## input

test<-read.table(header=T,text="      snp      gene distance
rs5   rs5     KRIT1        1
rs6   rs6   CYP51A1        1
rs7   rs7 LOC401387        1
rs8   rs8      CDK6        1
rs9   rs9      CDK6        1
rs10 rs10      CDK6        1
")
features<-c("rs5","rs7","rs10")

## calculate

inVar <- toString(shQuote(features, type = "csh")) # 'rs5','rs7','rs10'

fn$sqldf("SELECT * FROM test t
          WHERE t.row_names IN ($inVar)"
           , row.names = TRUE)

## result
#      snp      gene distance
#rs5   rs5     KRIT1        1
#rs7   rs7 LOC401387        1
#rs10 rs10      CDK6        1

此外,如果数据足够大,我们可以使用索引来加快速度。有关此详细信息和其他详细信息,请参阅。

数据。表解决方案:

library(data.table)
dbsnp <- structure(list(snp = c("rs5", "rs6", "rs7", "rs8", "rs9", "rs10"
), gene = c("KRIT1", "CYP51A1", "LOC401387", "CDK6", "CDK6", 
"CDK6"), distance = c(1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("snp", 
"gene", "distance"), class = "data.frame", row.names = c("rs5", 
"rs6", "rs7", "rs8", "rs9", "rs10"))

DT <- data.table(dbsnp, key='snp')
features <- c('rs5', 'rs7', 'rs9')
DT[features]

   snp      gene distance
1: rs5     KRIT1        1
2: rs7 LOC401387        1
3: rs9      CDK6        1
库(data.table)

dbsnp检查
data.table
包。您可以使用键来执行此操作。您的“行名称”是否与snp列相同?是的,两者相同。我将查看data.table.只是出于兴趣,有没有人知道如果您首先使用
foo之类的机制获取行号,是否会有时间差?我尝试按照您建议的方式选择行,这将“通常”完成。它的速度快得多(我没意识到你可以从列表到列表的百分比)。从你显示的内容来看,我认为这两个对象都是“原子向量”,而不是R“列表”。我承认我对它的速度感到有点惊讶。酷-下次我会记住这个区别。事实上,我刚刚从你的帖子中了解到了两者的区别:
library(data.table)
dbsnp <- structure(list(snp = c("rs5", "rs6", "rs7", "rs8", "rs9", "rs10"
), gene = c("KRIT1", "CYP51A1", "LOC401387", "CDK6", "CDK6", 
"CDK6"), distance = c(1L, 1L, 1L, 1L, 1L, 1L)), .Names = c("snp", 
"gene", "distance"), class = "data.frame", row.names = c("rs5", 
"rs6", "rs7", "rs8", "rs9", "rs10"))

DT <- data.table(dbsnp, key='snp')
features <- c('rs5', 'rs7', 'rs9')
DT[features]

   snp      gene distance
1: rs5     KRIT1        1
2: rs7 LOC401387        1
3: rs9      CDK6        1