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)