7

さらに大きなテーブルから多数の行を抽出するための高速な方法を探しています。私のテーブルの一番上は次のとおりです。

> 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

当然のことながら、これを行う簡単な方法にはかなり長い時間temptable = dbsnp[features,]がかかります。

私はRのsqldfパッケージを介してこれを行う方法を検討してきました。それはもっと速いかもしれないと思いました。残念ながら、SQLで特定の行名を持つ行を選択する方法がわかりません。

ありがとう。

4

3 に答える 3

10

data.table解決策:

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
于 2012-08-30T19:53:55.657 に答える
5

を使用sqldfすると、次を使用rownames = TRUEして行名を照会できますrow_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

更新:代わりに、列に検索に必要なアイテムが含まれてfetいるデータフレームの場合:features

fet <- data.frame(features)
sqldf("SELECT t.* FROM test t
          WHERE t.row_names IN (SELECT features FROM fet)"
           , row.names = TRUE)

また、データが十分に大きい場合は、インデックスを使用して高速化できます。これおよびその他の詳細については、sqldf ホーム ページを参照してください。

于 2012-08-30T19:53:23.927 に答える
4

ほとんどの人が最初に試す方法は次のとおりです。

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

時間がかかるとおっしゃっていますので、RAM容量を超えて仮想メモリを使い始めたのではないかと思います。システムをシャットダウンしてから、実行中のアプリケーションとして R だけで再起動し、「仮想化」を回避できるかどうかを確認する必要があります。

于 2012-08-30T19:41:34.907 に答える