2014-02-26 39 views
1

只是一个简单的问题,一直给我一些问题。我想带一个20字符串:在字符串中替换一个字符中的一个长度为R的字符串

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' 

等等

我想一旦已经生成的列表将其写入到一个文本文件。

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

对不起,如果这是一个简单的问题。我想知道有一种方法可以使用gsub,使用stringr软件包等?

在此先感谢。

回答

3

下面是对指数使用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" 
+0

完美!非常感谢你 –

+0

我能够添加版本名称:names(combos)< - paste0(“s”,seq_along(combos),“\ n”) –

1

这里是另一种答案可能是有点更容易理解和修改:

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) 
相关问题