首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-向量化嵌套for循环?

R-向量化嵌套for循环?
EN

Stack Overflow用户
提问于 2015-03-01 04:46:14
回答 1查看 105关注 0票数 0

我有两个大的数据帧(head(CON_FRAs)和head(indels)如下所示),我希望比较和修改它们的值。我来自python背景,因此创建了这个嵌套的for循环,它实现了我的目标,即找到介于CON_FRAs$V4和CON_FRAs$V5之间的indels$V4的值,并将1加到indels$CON和CON_FRAs$V6上,只是非常慢(运行时间为1小时)。

有人能帮我把这段代码矢量化吗?

顺便说一句,我也意识到我不应该要求在嵌套循环中声明两次相同的if条件,但是当我在R中编程时,我发现许多事情是不直观的,并且不能让R从一个if语句中接受两个操作。

CON_FRAs

代码语言:javascript
复制
V1        V2        V3        V4        V5 V6
1  1  57859401  58018691  57859401  58018691  0
2  1  97522550  97892513  97522550  97892513  0
3  1 214173802 224638502 214173802 224638502  0
4  1 184035608 184239812 184035608 184239812  0
5  2 140988941 141140259 390239564 390390882  0
6  2 169205756 170181166 418456379 419431789  0

indels

代码语言:javascript
复制
V1        V2        V3         V4         V5  V6     V7  V8            V9 V10 mut_type CON BIG FUN MRA LET recomb
1  6  96651182  96651183 57859401 57859402  AA      T CLL 001-0002-03TD  NA  COMPLEX   0   0   0   0   0      0
2 10  38406960  38406961 1718780121 1718780122  AG      - CLL 003-0005-09TD  NA      DEL   0   0   0   0   0      0
3  2  87017743  87017744  336268366  336268367   C     CT CLL 003-0005-09TD  NA  COMPLEX   0   0   0   0   0      0
4 20   5538748   5538750 2724112091 2724112093 CCC      A CLL    012-02-1TD  NA  COMPLEX   0   0   0   0   0      0
5  9 139390648 139390649 1678550376 1678550377  AG      - CLL    012-02-1TD  NA      DEL   0   0   0   0   0      0
6 10  10498176  10498180 1690871337 1690871341   - GAAAAA CLL           125  NA      INS   0   0   0   0   0      0

我的嵌套循环

代码语言:javascript
复制
for(j in 1:length(indels$V4)){
   for(i in 1:length(CON_FRAs$V4)){
     if(CON_FRAs$V4[i] < indels$V4[j] & indels$V4[j] < CON_FRAs$V5[i])
       indels$CON[j] = 1
     if(CON_FRAs$V4[i] < indels$V4[j] & indels$V4[j] < CON_FRAs$V5[i])
       CON_FRAs$V6[i] = CON_FRAs$V6[i] + 1}}

更新:我已经设法提高了性能,使用了一种对半的方法,将一个矢量化命令放在一个循环中,从而消除了嵌套循环的指数增长,尽管仍然需要两个循环(见下文)。这已经将运行时间减少到2分钟以下。这将不得不做我现在,因为它是足够快,仍然感兴趣,如果有人可以提供一个完全矢量化的解决方案

代码语言:javascript
复制
for(j in 1:length(indels$V4)){
  inc(CON_FRAs$V6[CON_FRAs$V4 < indels$V4[j] & indels$V4[j] < CON_FRAs$V5]) <- 1}

for(i in 1:length(CON_FRAs$V6)){
  indels$CON[CON_FRAs$V4[i] < indels$V4 & indels$V4 < CON_FRAs$V5[i]] <- 1}
EN

回答 1

Stack Overflow用户

发布于 2015-03-01 05:14:24

就你的旁注问题而言,这应该可以解决它:

代码语言:javascript
复制
for(j in 1:length(indels$V4)){
   for(i in 1:length(CON_FRAs$V4)){
     if(CON_FRAs$V4[i] < indels$V4[j] & indels$V4[j] < CON_FRAs$V5[i]) {
       indels$CON[j] = 1
       CON_FRAs$V6[i] = CON_FRAs$V6[i] + 1}
                                 } }

我认为这实际上是两个不同的问题,当从“向量化”的角度考虑时,其中一个矩阵是为逻辑测试生成的,可能是使用“外部”。如果不是"indel$CON“列,我认为它可能是"V6”(使用非基包中的applycolMax )在“j”-rows上的"any“的结果:

代码语言:javascript
复制
outer(1:nrow(indels), 
      1:nrow(CON_FRAs),
       function(X,Y) {CON_FRAs$V4[X] < indels$V4[Y] & 
                      indels$V4[Y] < CON_FRAs$V5[X]} )

      [,1]  [,2]  [,3]  [,4]  [,5]  [,6]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE FALSE FALSE

注意事项。我在之前的工作中得到了不同的结果。修复逻辑表达式中的索引可以得到与您的代码相同的(微不足道的)结果,但如果您放入更好的测试用例,我们可能会更好地比较结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28786706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档