代码之家  ›  专栏  ›  技术社区  ›  stats_noob

R: 为函数引入WHILE循环

  •  1
  • stats_noob  · 技术社区  · 2 年前

    我正在使用R编程语言。

    我试图统计某个模式(例如ABCD)第一次出现在随机字符串(例如AC)中的次数 ABCD CDBCABCDBC-答案=6)。为此,我编写了一个函数:

    library(stringr)
    
    letters <- c("A", "B", "C", "D")
    
    results <- list()
    for (i in 1:100)
        
    {
        
        iteration_i = i
        letters_i = paste(sample(letters, 100, replace=TRUE, prob=c(0.25, 0.25, 0.25, 0.25)),collapse="")
        position_i = str_locate(letters_i, "ADBC") 
        
        results_tmp = data.frame(iteration_i , letters_i, position_i)
        
        results[[i]] <- results_tmp
        
    }
    
    results_df <- do.call(rbind.data.frame, results)
    

    现在看起来是这样的(注意:我认为这不正确-在第5行中,我在行的开头看到了ABCD,但出于某种原因,它被记录为NA):

      iteration_i                                                                                            letters_i start end
    1           1 BACDCCCDCCCDCDDBBCBBAACACBBBBAAABDDDACAABDDABBABADCDDCDACCBBBCABCDABCDCCCDADDDBADBDCADAABDBDCDCAACCB    NA  NA
    2           2 CACACCCCDCCBADACBBAADBCABBAAAAADBDDBCADCAAADADAAABDCABBAABABBCBDADCDDDDCDBADDBDCBCDDDBDCDDAACBBBBACA    20  23
    3           3 CDCBDAABDDDDADBAAABBADAADBDDDBDADDCABADDDCDABBBCBCBBACBBDADABBCDCCACDBCDCDDBDBADBCDCADDADDDBDBAAABBD    79  82
    4           4 ADBCDBADADBAAACAADACACACACBDDCACBDACCBDAAABDBAAAABBCCDBADADDADCBCABCBAABDCBCDCDACDCCDBADCBDDAADBCDAC     1   4
    5           5 D**ABCD**DDCCBCDABADBBBBCDBCADCBBBDCAAACACCCBCBCADBDDABBACACBDABAAACCAAAAACCCCBCBCCABABDDADBABDDDCCDDCCC    NA  NA
    6           6 DDDDDBDDDDBDDDABDDADAADCABCDAABBCCCDAABDDAACBDABBBBBABBCBDADBDCCAAADACCBCDDBDCAADCBBBCACDBBADDDDCABC    NA  NA
    

    目前,我只生成了100个字母,希望这足以观察到所需的模式(有时这不会发生,请注意NA)- 有没有办法在我所写的内容中添加一个WHILE循环,以不断生成字母,直到所需的模式首次出现?

    有人能告诉我怎么做吗?

    谢谢

    1 回复  |  直到 2 年前
        1
  •  1
  •   Rui Barradas    2 年前

    循环是一个 repeat 循环,不是 while ,只有找到模式时才会断开。我已经将结果列表长度设置为2,没有必要为了测试代码而将其变大。

    library(stringr)
    
    Letters <- c("A", "B", "C", "D")
    Pattern <- "ADBC"
    n <- 2L
    
    set.seed(2022)
    
    results <- vector("list", length = n)
    for (i in seq.int(n)) {
      repeat {
        l <- sample(Letters, 100, replace = TRUE, prob=c(0.25, 0.25, 0.25, 0.25))
        letters_i <- paste(l, collapse = "")
        position_i <- str_locate(letters_i, pattern = Pattern)
        if(any(!is.na(position_i))) break
      }
      results_tmp <- data.frame(iteration = i, letters = letters_i, position_i)
      
      results[[i]] <- results_tmp
    }
    
    results_df <- do.call(rbind.data.frame, results)
    results_df
    #>   iteration                                                                                              letters start end
    #> 1         1 ADBDBDBBCABBBDDBADDAADCBBADACACDCCBBADAADCDDABADCABCDCDDCCCBDDAABACCBDAAAADBDDCCCCADBCBBDABBDCCCBADD    83  86
    #> 2         2 DDBDBDBCDDBDBBBDBABBCCBBCCBDBDABBAAABACABADCCBBABADBCCCDABABBDBADCADCABDDDAAACCBDCAACACACBBDDDACCDDC    50  53
    

    于2022年6月11日由 reprex package (v2.0.1)