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.
谢谢!
似乎是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)
嗯,这些N和M(和更大的加速甚至更好)的速度快100倍N.
你可以比较结果:
head(g)
head(dt)
Run Code Online (Sandbox Code Playgroud)