R:当输入数据帧非常大时优化 For 循环
R: Optimizing a For Loop when input data frame is very large
我有一个名为 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
的单独数据框的备用 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
因此,我尝试在下面通过为 protein1
设置一个名为 demo1
的向量来做到这一点。它适用于小场景,但这太荒谬了……它需要永远。另外,我最终也会为 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"))
}
此外(在"optimization"的同一主题下),有没有办法在每次完成 5000 行时打印一条消息(即每次 i == 5000 的倍数)?
将您的转化 table 视为地图
map = setNames(idconversiontable$From, idconversiontable$To)
然后使用地图上的名称从蛋白质 ID 到基因符号
genes = map[ppiensemble$protein1]
这 'just works' 在查找不存在的符号时,例如,
map = setNames(c("a", "b"), c("A", "B"))
map[c("A", "C")]
## A <NA>
## "a" NA
或者可能是稍微改进的 (?) 版本
unname(map[c("A", "C")])
## [1] "a" NA
我有一个名为 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
的单独数据框的备用 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
因此,我尝试在下面通过为 protein1
设置一个名为 demo1
的向量来做到这一点。它适用于小场景,但这太荒谬了……它需要永远。另外,我最终也会为 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"))
}
此外(在"optimization"的同一主题下),有没有办法在每次完成 5000 行时打印一条消息(即每次 i == 5000 的倍数)?
将您的转化 table 视为地图
map = setNames(idconversiontable$From, idconversiontable$To)
然后使用地图上的名称从蛋白质 ID 到基因符号
genes = map[ppiensemble$protein1]
这 'just works' 在查找不存在的符号时,例如,
map = setNames(c("a", "b"), c("A", "B"))
map[c("A", "C")]
## A <NA>
## "a" NA
或者可能是稍微改进的 (?) 版本
unname(map[c("A", "C")])
## [1] "a" NA