我有两个大的数据帧(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
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 0indels
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我的嵌套循环
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分钟以下。这将不得不做我现在,因为它是足够快,仍然感兴趣,如果有人可以提供一个完全矢量化的解决方案
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}发布于 2015-03-01 05:14:24
就你的旁注问题而言,这应该可以解决它:
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”(使用非基包中的apply或colMax )在“j”-rows上的"any“的结果:
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注意事项。我在之前的工作中得到了不同的结果。修复逻辑表达式中的索引可以得到与您的代码相同的(微不足道的)结果,但如果您放入更好的测试用例,我们可能会更好地比较结果。
https://stackoverflow.com/questions/28786706
复制相似问题