【问题标题】:Replacing one character once in string for an n-length string in R将字符串中的一个字符替换为R中的n长度字符串
【发布时间】:2014-03-28 13:48:57
【问题描述】:

只是一个简单的问题给我带来了一些问题。我想取一个20个字符的字符串:

s0<-c("ABCDABCDABCDABCDABCD")

并制作一个字符串列表,每个字符串都有一个唯一的标题,并且只有一个字母更改为其他三个字母之一。 例如:

s0
ABCDABCDABCDABCDABCD  # original
s1
BBCDABCDABCDABCDABCD  # first 'A' to 'B'
s2
CBCDABCDABCDABCDABCD  # first 'A' to 'C'
s4
DBCDABCDABCDABCDABCD  # first 'A' to 'D'
s5
AACDABCDABCDABCDABCD  # second 'B' to 'A'
s6
ACCDABCDABCDABCDABCD  # second 'B' to 'C'
s7
ADCDABCDABCDABCDABCD  # second 'B' to 'D'

等等……

列表生成后,我想将其写入 .txt 文件。

我只想对每个字符串版本进行一个字符更改,但我希望有一个版本列表,其中包含所有可能的组合(每个位置的更改)。

抱歉,这是一个简单的问题。我想知道有没有一种方法可以使用 gsub、使用 stringr 包等?

提前致谢。

【问题讨论】:

    标签: string r text replace


    【解决方案1】:

    这里有一个解决方案,在索引号上使用lapply 来替换:

    letters <- c("A", "B", "C", "D")
    s0 <- c("ABCDABCDABCDABCDABCD")
    combos <- unique(unlist(lapply(1:nchar(s0), function(idx) {
      paste0(substr(s0, 1, idx-1), letters, substr(s0, idx+1, nchar(s0)))
    })))
    combos
    #  [1] "ABCDABCDABCDABCDABCD" "BBCDABCDABCDABCDABCD" "CBCDABCDABCDABCDABCD"
    #  [4] "DBCDABCDABCDABCDABCD" "AACDABCDABCDABCDABCD" "ACCDABCDABCDABCDABCD"
    #  [7] "ADCDABCDABCDABCDABCD" "ABADABCDABCDABCDABCD" "ABBDABCDABCDABCDABCD"
    # [10] "ABDDABCDABCDABCDABCD" "ABCAABCDABCDABCDABCD" "ABCBABCDABCDABCDABCD"
    # [13] "ABCCABCDABCDABCDABCD" "ABCDBBCDABCDABCDABCD" "ABCDCBCDABCDABCDABCD"
    # [16] "ABCDDBCDABCDABCDABCD" "ABCDAACDABCDABCDABCD" "ABCDACCDABCDABCDABCD"
    # [19] "ABCDADCDABCDABCDABCD" "ABCDABADABCDABCDABCD" "ABCDABBDABCDABCDABCD"
    # [22] "ABCDABDDABCDABCDABCD" "ABCDABCAABCDABCDABCD" "ABCDABCBABCDABCDABCD"
    # [25] "ABCDABCCABCDABCDABCD" "ABCDABCDBBCDABCDABCD" "ABCDABCDCBCDABCDABCD"
    # [28] "ABCDABCDDBCDABCDABCD" "ABCDABCDAACDABCDABCD" "ABCDABCDACCDABCDABCD"
    # [31] "ABCDABCDADCDABCDABCD" "ABCDABCDABADABCDABCD" "ABCDABCDABBDABCDABCD"
    # [34] "ABCDABCDABDDABCDABCD" "ABCDABCDABCAABCDABCD" "ABCDABCDABCBABCDABCD"
    # [37] "ABCDABCDABCCABCDABCD" "ABCDABCDABCDBBCDABCD" "ABCDABCDABCDCBCDABCD"
    # [40] "ABCDABCDABCDDBCDABCD" "ABCDABCDABCDAACDABCD" "ABCDABCDABCDACCDABCD"
    # [43] "ABCDABCDABCDADCDABCD" "ABCDABCDABCDABADABCD" "ABCDABCDABCDABBDABCD"
    # [46] "ABCDABCDABCDABDDABCD" "ABCDABCDABCDABCAABCD" "ABCDABCDABCDABCBABCD"
    # [49] "ABCDABCDABCDABCCABCD" "ABCDABCDABCDABCDBBCD" "ABCDABCDABCDABCDCBCD"
    # [52] "ABCDABCDABCDABCDDBCD" "ABCDABCDABCDABCDAACD" "ABCDABCDABCDABCDACCD"
    # [55] "ABCDABCDABCDABCDADCD" "ABCDABCDABCDABCDABAD" "ABCDABCDABCDABCDABBD"
    # [58] "ABCDABCDABCDABCDABDD" "ABCDABCDABCDABCDABCA" "ABCDABCDABCDABCDABCB"
    # [61] "ABCDABCDABCDABCDABCC"
    

    【讨论】:

    • 完美!非常感谢
    • 我能够添加版本名称:names(combos)
    【解决方案2】:

    这是另一个可能更容易理解和修改的答案:

    s0 <- c("ABCDABCDABCDABCDABCD")
    nucleotides <- c( "A", "B", "C", "D" )
    
    sequences <- rep( NA, 1 + 3*nchar( s0 ) ) #pre-allocate space for the results
    
    sequences[1] <- s0
    num_found = 1
    
    for( i in 1:nchar( s0 ) )
    {
      prefix = substring( s0, 1, i - 1 )
      old_base = substring( s0, i, i )
      sufix = substring( s0, i + 1 )
    
      for( new_base in nucleotides )
      {
        if( new_base != old_base )
        {
          num_found = num_found + 1
          sequences[num_found] <- paste( prefix, new_base, sufix, sep="" )
        }
      }
    }
    
    print( sequences )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-16
      • 2021-09-26
      • 2015-10-24
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多