嵌套for循环和嵌套if ... else语句非常慢

时间:2017-08-29 13:03:30

标签: r performance nested-loops nested-if

我是R的新手,我编写了一段代码来迭代数据框(逐个单元格),通过if ... else语句执行“简单”检查,但事实证明它非常慢。

这里是代码

for(m in 1:(ncol(df) - 1)){
    listmatch <- unlist(subset(dt, Experiment == m & Number == m)[[which(colnames(dt) == "id")]])
    for(n in 1:nrow(df)){
      if (is.na(df[n, m]) == TRUE){
        df[n, m] <- NA
      } else {
        if (sum(as.numeric(unlist(strsplit(as.character(df[n, 33]), split = ";"))) %in% listmatch, na.rm = TRUE) > 0){
          df[n, m] <- 1
        } else {
          df[n, m] <- NA
      }}
    next}
  next}

只是为了给出一些维度,df是800变量的123变量,listmatch平均是5000个值的向量,而df的第33列包含诸如< / p>

1;2;3;4;5;6;7;8;9;10;11;12;13...

平均150个以分号分隔的值。 我不明白为什么它很慢,既不优化它也不快。 是嵌套的for循环还是嵌套的if ... else语句使它变慢? 有什么建议吗?

这是我的数据示例 DF

        [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]     [,33]
 [1,]    NA    NA    NA    NA    NA     1    NA     1;8;9;6
 [2,]     1    NA    NA    NA    NA    NA    NA           5
 [3,]     1    NA    NA     1    NA    NA    NA           6
 [4,]     1    NA     1    NA     1     1     1   88;98;125
 [5,]    NA    NA    NA    NA    NA    NA    NA         2;3
 [6,]     1    NA    NA    NA    NA    NA    NA         4;5
 [7,]    NA    NA    NA    NA    NA    NA     1          44
 [8,]    NA    NA     1     1     1    NA    NA          46
 [9,]    NA     1     1    NA    NA    NA    NA          78
[10,]    11    NA    NA    NA    NA    NA    NA     147;411
[11,]    NA     1    NA    NA    NA    NA    NA         400
[12,]    NA     1     1    NA    NA    NA    NA         658
[13,]    NA     1    NA     1    NA    NA    NA 87;988;1226
[14,]    NA    NA    NA    NA     1     1    NA 121;232;321
[15,]    NA    NA     1    NA    NA     1    NA           5

而dt看起来像这样

           Text Experiment Number    id
 [1,]        df          5      3  1
 [2,]        fd          8      8  8
 [3,]       reh          7      4  6
 [4,]   egfdgsd          4      8  8
 [5,]  fbdsgryj          5      3  44
 [6,] rtryyukfn          7      2  411
 [7,]    fgsfde          5      6  400
 [8,] wthrthmgh          2      7  1274
 [9,]      vdfd          2      8  658
[10,]       vfr          8      6  147
[11,]     brtey          3      2  1226
[12,]     tyirt          7      5  988
[13,]       fyi          5      4  87
[14,]     ywrtj          7      5  46
[15,]      kyou          8      6  4
[16,]      pkjh          1      7  8
[17,]    retuyk          5      4  9
[18,]        re          7      8  11
[19,]     eryre          6      3  12
[20,]      fdhd          6      1  18

我忘了提到我想保留代码

listmatch <- unlist(subset(dt, Experiment == m & Number == m)[[which(colnames(dt) == "id")]])

实际上,我正在根据m的值进行过滤,但我希望将来能够手动应用不同的过滤,即...Experiment == m*2 & Number == m*5)...

0 个答案:

没有答案