R真的很慢矩阵/ data.frame索引选择

use*_*705 3 r matrix dataframe

我正在选择data.frame的子集g.raw,如下所示:

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,] 
Run Code Online (Sandbox Code Playgroud)

有用.但是,最后一行非常慢.

g.raw约为18M行,snps约为1M.我意识到这些是非常大的数字,但这看起来像一个简单的操作,并将g读入内存中保存的矩阵/ data.frame不是问题(花了几分钟),而我上面描述的这个操作正在采取小时.

我如何加快速度?我想要的只是缩小g.raw.

谢谢!

red*_*ode 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
Run Code Online (Sandbox Code Playgroud)

data.frame 做法:

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

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 
Run Code Online (Sandbox Code Playgroud)

嗯,这些NM(和更大的加速甚至更好)的速度快100倍N.

你可以比较结果:

head(g)
head(dt)
Run Code Online (Sandbox Code Playgroud)