繁体   English   中英

R:在输入数据帧很大时优化For循环

[英]R: Optimizing a For Loop when input data frame is very large

我有一个名为ppiensemble的巨大数据ppiensemble ,其中包含近500万行。 这是一个示例:

> head(ppiensemble, 10)
          protein1        protein2
1  ENSP00000000233 ENSP00000020673
2  ENSP00000000233 ENSP00000054666
3  ENSP00000000233 ENSP00000158762
4  ENSP00000000233 ENSP00000203407
5  ENSP00000000233 ENSP00000203630
6  ENSP00000000233 ENSP00000215071
7  ENSP00000000233 ENSP00000215115
8  ENSP00000000233 ENSP00000215375
9  ENSP00000000233 ENSP00000215565
10 ENSP00000000233 ENSP00000215574

此处的目标是将列protein1中的所有项目转换为来自名为idconversiontable的单独数据idconversiontable的备用ID。 我想提取idconversiontable$From的相应字符。 还要注意, idconversiontable仅具有约50000行:

> head(idconversiontable, 10)
                To   From
1  ENSP00000167825 Q9HCE6
2  ENSP00000355060 Q9HCE6
3  ENSP00000364564 Q9HCE6
4  ENSP00000244303 Q9Y2N7
5  ENSP00000300862 Q9Y2N7
6  ENSP00000366898 Q9Y2N7
7  ENSP00000255324 Q9BXT8
8  ENSP00000255325 Q9BXT8
9  ENSP00000322242 Q8N5U6
10 ENSP00000415682 Q8N5U6

所以,我试图通过建立一个称为矢量做以下demo1用于protein1 它适用于小型设备,但这太荒谬了……它永远存在。 另外,我最终也会对protein2做同样的事情。 关于如何加快此过程的任何想法?

demo1 <- vector(mode="character", length=nrow(ppiensemble))
for(i in 1:nrow(ppiensemble)) {
  demo1[i] <- try(ifelse(ppiensemble$protein1[i] %in% idconversiontable$To,
  as.character(idconversiontable[which(idconversiontable$To == ppiensemble$protein1[i]), 2]),
  "NA"))
    }

另外(在“优化”的同一主题下),是否有一种方法可以在每完成5000行(即,每当i == 5000的倍数)时打印一条消息?

将转换表视为地图

map = setNames(idconversiontable$From, idconversiontable$To)

然后使用地图上的名称从蛋白质ID到基因符号

genes = map[ppiensemble$protein1]

当查找不存在的符号时,这“有效”,例如

map = setNames(c("a", "b"), c("A", "B"))
map[c("A", "C")]
##   A <NA> 
## "a"   NA 

或稍微改进(?)的版本

unname(map[c("A", "C")])
## [1] "a" NA 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM