3

g.raw次のように、data.frameのサブセットを選択しています。

g.raw <- read.table(gfile,sep=',', header=F, row.names=1) 
snps = intersect(row.names(na.omit(csnp.raw)),row.names(na.omit(esnp.raw))) 
g = g.raw[snps,] 

できます。ただし、その最後の行は非常に遅いです。

g.rawは約18M行で、snps約1Mです。これらはかなり大きな数だと思いますが、これは単純な操作のようで、メモリに保持されているmatrix / data.frameへのgの読み込みは問題ではありませんでした(数分かかりました)が、上記で説明したこの操作には時間がかかります時間。

これをスピードアップするにはどうすればよいですか?私が欲しいのはg.rawをたくさん縮めることです。

ありがとう!

4

2 に答える 2

5

data.table輝けるケースのようです。

再現data.frame:

set.seed(1)
N <- 1e6    # total number of rows
M <- 1e5    # number of rows to subset

g.raw <- data.frame(sample(1:N, N), sample(1:N, N), sample(1:N, N))
rownames(g.raw) <- sapply(1:N, function(x) paste(sample(letters, 50, replace=T), collapse=""))
snps <- sample(rownames(g.raw), M)

head(g.raw) # looking into newly created data.frame
head(snps)  # and rows for subsetting

data.frameアプローチ:

system.time(g <- g.raw[snps,])
# >    user  system elapsed 
# > 881.039   0.388 884.821 

data.tableアプローチ:

require(data.table)
dt.raw <- as.data.table(g.raw, keep.rownames=T)
# rn is a column with rownames(g.raw)
system.time(setkey(dt.raw, rn))
# >  user  system elapsed 
# > 8.029   0.004   8.046 

system.time(dt <- dt.raw[snps,])
# >  user  system elapsed 
# > 0.428   0.000   0.429 

これらのNとを使用すると 100 倍高速になりますM(さらに大きな を使用するとさらに高速になりNます)。

結果を比較できます。

head(g)
head(dt)
于 2013-01-17T23:59:22.967 に答える
0

データが均一タイプの場合は、事前に割り当てて、構築に行列を使用します。はるかに美しい答えについては、R で反復的に構築されたデータフレームを参照してください。

アップデート

あなたは正しかった - ボトルネックは選択にあった。解決策は、snps の数値インデックスを一度検索してから、次のようにそれらの行を選択することです。

g <- g.raw[match(snps, rownames(g.raw)),]

私は R の初心者です。おかげで、これは有益な演習でした。FWIW、行名を使用しないというコメントを他の人から見たことがあります-おそらくこのようなことが原因です。

更新 2

多かれ少なかれ重複しているR の高速サブセット化も参照してください。最も重要なのは、最初の回答とExtract.data.frameへの参照に注意してください。行名の一致が部分的であり、行名にハッシュテーブルがあり、ここで提案した解決策が正規のものであることがわかります。ただし、これらすべてと実験を考えると、なぜそれほど遅いのかわかりません。部分一致アルゴリズムは、最初にハッシュ テーブルで完全一致を検索する必要があります。この場合、これは常に成功するはずです。

于 2013-01-17T22:30:10.633 に答える