结论:从数据框里面取某列数据,三种方法的时间消耗区别很大,直接用索引值,是最快的,而用$符号其次,用列名最慢。
我在R里面建立了一个表达量矩阵,列名是一个个样品,行是一个个探针,矩阵值是该探针在该样品测定的表达量。
那么,如果我要看看名为"202723_s_at"的探针的表达向量与其它所有探针的表达向量的相关系数,我可以用以下三种方法:
> system.time(apply(all_dat_t,2,function(x) cor(all_dat_t$"202723_s_at",x)))
user system elapsed
22.93 0.03 23.03
> system.time(apply(all_dat_t,2,function(x) cor(all_dat_t[,"202723_s_at"],x)))
Timing stopped at: 92.02 5.32 97.66
太耗时间了,省去
> system.time(apply(all_dat_t,2,function(x) cor(all_dat_t[,grep(prob,names(all_dat_t))],x)))
Timing stopped at: 13.55 0.04 13.66
> prob_num=grep(prob,names(all_dat_t))
> system.time(apply(all_dat_t,2,function(x) cor(all_dat_t[,prob_num],x)))
user system elapsed
8.14 0.01 8.17
可以看出,如果我首先根据探针名,grep出它在该表达量矩阵的列数,然后用列数来提取它的表达量是最快的,而且时间改善非常明显!
我们再探究一下cor函数的效率问题
探究的矩阵有54675个变量,每个变量均有189个观测值,如果取这个大矩阵的部分变量来求相关系数,结果如下!
> system.time(cor(all_dat_t[,1:10]))
user system elapsed
0.001 0.000 0.001
> system.time(cor(all_dat_t[,1:100]))
user system elapsed
0.003 0.000 0.003
> system.time(cor(all_dat_t[,1:1000]))
user system elapsed
0.107 0.002 0.108
> system.time(cor(all_dat_t[,1:10000]))
user system elapsed
11.102 0.849 11.983
> system.time(cor(all_dat_t)) 约六分钟也是可以搞定的
但是如果cor(all_dat_t),六分钟后得到的相关系数矩阵约32G,非常恐怖!
但是它很明显没有把这个32G相关系数矩阵存储到内存,因为我的机器本来就16G内存。我至今不能明白R具体实现机理