這似乎是在那裏data.table
可以發光的情況。
再現data.frame
:快與這些N
和M
(甚至更好SPEE
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
好,100倍倍:
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
方法與更大的N
)。
您可以比較的結果:
head(g)
head(dt)
我不認爲還有比您的解決方案更快的方法。 –
我可以看到如何通過字符索引可能會很慢,但我很難包裝我的頭,這可能需要幾個小時。你能提供一個更完整的代碼示例嗎? – joran
在%snps中創建邏輯矢量'ind < - rownames(g.raw)%並使用'ind'創建子集。這是否更快? – joran